Java 每个id有一个运行实例的Akka路由消息

Java 每个id有一个运行实例的Akka路由消息,java,scala,akka,Java,Scala,Akka,假设我有一系列消息,其中包含标识客户机的id。不同客户端的消息可以并行处理。同一客户端的消息一次只能处理一条 有了Akka,我希望能够将消息路由到一个参与者池,但满足每个客户端id最多一个并发参与者的约束 最好的方法是什么?我是否误解了Akka背后的任何概念,或者试图应用不符合演员模型的传统概念?我相信这可以非常简单地符合演员模型。根据定义,单个参与者按顺序处理其传入的消息,一种简单的方法是为每个客户端创建一个参与者 举个简单的例子,您使用一个参与者作为路由器,每个现有客户机使用一个工人 c

假设我有一系列消息,其中包含标识客户机的id。不同客户端的消息可以并行处理。同一客户端的消息一次只能处理一条

有了Akka,我希望能够将消息路由到一个参与者池,但满足每个客户端id最多一个并发参与者的约束


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

我相信这可以非常简单地符合演员模型。根据定义,单个参与者按顺序处理其传入的消息,一种简单的方法是为每个客户端创建一个参与者

举个简单的例子,您使用一个参与者作为路由器,每个现有客户机使用一个工人

  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(...)
    }
  }

请记住,参与者是非常轻量级的,因此即使您需要跟踪很多参与者,这一点也适用。

或者如果您希望构建集群系统,请查看集群分片