私はこれがアクターモデルに非常に簡単に合うと信じています。定義によると、単一のアクタが着信メッセージを順番に処理するので、これについての簡単な方法は、クライアントごとに1つのアクタを作成することです。
ルータとして1つのアクターを使用し、既存のクライアントごとに1つのワーカーを使用するこの単純な例を考えてみましょう。
class Boss extends Actor {
override def receive: Receive = jobHandler(Map.empty[ClientId, ActorRef])
def jobHandler(workers: Map[ClientId, ActorRef]): Receive = {
case [email protected](id, ...) if workers contains id =>
workers(id) ! j
case [email protected](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(...)
}
}
俳優は非常に軽量ですので、たくさんの俳優を追跡する必要がある場合でも、これは保持されます。
クラスタシステムを構築する場合は、クラスタシャーディングhttp://doc.akka.io/docs/akka/current/scala/cluster-sharding.html#cluster-sharding-scalaを参照してください。 – johanandren