Akka使用每个id的单个运行实例路由消息

时间:2017-01-31 20:40:58

标签: java scala akka

假设我有一系列包含标识客户端的ID的消息。可以并行处理不同客户端的消息。同一客户端的消息一次只能处理一个。

使用Akka我希望能够将消息路由到一个actor池,但每个客户端id约束最多只能满足一个并发actor。

最好的方法是什么?我是否误解了Akka背后的任何概念,或者试图应用不符合演员模型的传统概念?

1 个答案:

答案 0 :(得分:1)

我相信这可以很简单地适合演员模特。根据定义,单个actor按顺序处理其传入的消息,一个简单的方法就是为每个客户端创建一个actor。

举一个这个简单的例子,你可以使用一个actor作为路由器,每个现有客户端使用一个worker。

  class Boss extends Actor {

    override def receive: Receive = jobHandler(Map.empty[ClientId, ActorRef])

    def jobHandler(workers: Map[ClientId, ActorRef]): Receive = {

      case j@Job(id, ...) if workers contains id => 
        workers(id) ! j

      case j@Job(id, ...) =>
        val worker = context.actorOf(Props[Worker])
        worker ! j
        context.become(jobHandler(workers + (id -> worker)))
    }
  }

  class Worker extends Actor {
    override def receive: Receive = {
      case Job(...) => doStuff(...)
    }
  }

请记住,演员非常轻量级,所以即使您需要跟踪很多演员,这种情况仍然存在。