2011-12-29 4 views
2

私はAkkaを初めて使いました。これが基本的な質問であれば、事前にお詫び申し上げます。以下のシナリオを実装するためにアクターを使用する方法や、それが可能である(または望ましい)かどうかはわかりません。新しいメッセージを待っている間もまだ動作しているAkkaの俳優?

  • 私は、特定の状態を同時に維持する責任を負っている多数のアクター(つまりプロデューサ)があり、それらはすべて、変更が発生したときに別のアクタ(つまり消費者)に通知します。
  • コンシューマは、特定のタスクを繰り返し実行する必要があります。これは、すべてのプロデューサの状態を開始する必要があるタスクです。また、プロデューサからのメッセージを受信したときの状態の変化にも対応する必要があります。

Akkaを検討する前に、私は自分の単純なアクターモデルをロールして、各アクターは独自のスレッドで実行していました。実行()メソッドは、イベントキューを監視しますので、私は、消費者が継続的にこれに似た何かを持っていることができます:

while not done 
    poll the event queue 
    if something was polled 
     process the event 
    if all state is available 
     do one step of the long running task 

をイベントキューの継続的なポーリングが少なくとも私とよく座って、それはなかったですイベント間の長期的な作業を進めました。

これを実装するためにAkkaアクタを使用する最もよい方法はありますか?長時間実行されているタスクの別のステップを実行するために、消費者にメッセージを送信する(または消費者自身に送信される)「ハートビート」を実装することもできますが、長時間実行されるタスクのステップの持続時間が一定ではありません。私はそれがあまりにも忙しいので、プロデューサーからのメッセージにすばやく応答しないように反復をキューに入れたくないです。しかし、私はあまり頻繁にそれを予定したくないので、それが進行している可能性があるときにアイドル状態に座っている...

これは並行処理のデータフローモデルを使用する方が適切でしょうか?ちょうど準備ができていますか?)状態がすべてバインドされるまで、コンシューマは開始できません。そのため、プロセスをデータフロー変数の観点から定義するのは当然のようです。しかし、データフロー変数が一度しかバインドされない場合、コンシューマからの状態で繰り返し更新を取得することは適切ではないようです。

答えて

2

Akka EventBusの変更をパブリッシュし、コンシューマがこれらのイベントを待機するようにすることができます。必要なときにフルチャンクを処理するか、処理する新しいアクタを生成できます完全な塊。

+0

ありがとう、それは私が必要としていたものです! –