2017-01-31 12 views
0

私は、クライアントを識別するIDを含む一連のメッセージを持っているとしましょう。異なるクライアントのメッセージは並行して処理できます。同じクライアントのメッセージは、一度に1つしか処理できません。idごとに1つの実行インスタンスを持つAkkaルーティングメッセージ

Akka私は、アクターのプールにメッセージをルーティングすることができますが、クライアントIDごとに最大1つの同時アクターでこれを満たすことができます。

このアプローチにはどのような方法が最適でしょうか?アクカの背後にある概念を誤解しているのですか、アクターモデルに合わない伝統的な概念を適用しようとしていますか?

答えて

0

私はこれがアクターモデルに非常に簡単に合うと信じています。定義によると、単一のアクタが着信メッセージを順番に処理するので、これについての簡単な方法は、クライアントごとに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(...) 
    } 
    } 

俳優は非常に軽量ですので、たくさんの俳優を追跡する必要がある場合でも、これは保持されます。

+0

クラスタシステムを構築する場合は、クラスタシャーディングhttp://doc.akka.io/docs/akka/current/scala/cluster-sharding.html#cluster-sharding-scalaを参照してください。 – johanandren

関連する問題