假设我有一系列包含标识客户端的ID的消息。可以并行处理不同客户端的消息。同一客户端的消息一次只能处理一个。
使用Akka我希望能够将消息路由到一个actor池,但每个客户端id约束最多只能满足一个并发actor。
最好的方法是什么?我是否误解了Akka背后的任何概念,或者试图应用不符合演员模型的传统概念?
答案 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(...)
}
}
请记住,演员非常轻量级,所以即使您需要跟踪很多演员,这种情况仍然存在。