13

これは設計上の問題です。

一連の処理を行うアクターのツリーがあるとします。処理は、クライアント/接続アクター (つまり、ツリーがサーバー) によって開始されます。最終的に、クライアント アクターは応答を必要とします。つまり、私はこのようなアクター システムを持っています。

    ActorA  <---reqData--- Client_Actor
       | msgA                    /|\                      
      \|/                         |                 
    ActorB                        |                  
  msgB |  \ msgD                  | 
      \|/  \/                     | 
    ActorC  ActorD---------msgY-->|
       |_____________msgX_________|

クライアント システムが必要とする応答は、リーフ アクター (つまりActorCおよび/またはActorD) からの出力です。ツリー内のこれらのアクターは、外部システムと対話している可能性があります。このツリーは、ルーティングされる可能性のある定義済みのアクターのセットである可能性があります (つまりClient_actor、アクター ツリーのルートへのアクター参照があるだけですActorA)。

問題は、ファイナル/リーフ アクターからクライアント アクターへの応答 ( msgX&/or ) の送信を管理するための最適なパターンは何かということです。msgY

次のオプションを考えることができます。

  • 接続クライアントごとにツリーを作成し、アクターが送信者を追跡できるようにします。アクターがmsgXまたはを取得したら、msgYそれを元の送信者 ref に送り返し、メッセージがツリーを介して戻されるようにします。つまり、各アクターは元の送信者の参照を保持します。
  • Client_Actor何らかの方法でメッセージ内のref を送信し、reqDataこれをツリーで使用されるすべてのメッセージに複製して、リーフ アクターが直接応答できるClient_actorようにします。これは最もパフォーマンスの高いオプションのようです。これを行う方法がわかりません (クライアント アクター ref を保持するメッセージ ケース クラスで何らかの特性を考えています)...
  • 何らかの方法で、ツリーを通過したメッセージ内の一意の ID に基づいてクライアント アクターをルックアップするか、actorselection を使用します (これがリモーティングでうまく機能するかどうかはわかりません)...
  • より良いなにか...

参考までに、私は Akka 2.2.1 を使用しています。

乾杯!

4

3 に答える 3

1

このような状況のために、私は a と呼ばれるものを書きましたResponseAggregator。これは、Actor必要に応じて (永続的な単一のインスタンスとしてではなく) インスタンス化され、引数として destination ActorRef、任意のkey(単一の宛先が複数のアグリゲーターによって供給される場合にアグリゲーターを区別するため)、Seq[Any]受信した保持応答を取る完了述語です。これまでのアグリゲーターによって、返されるものtrueこれらの応答が集計プロセスの完了とタイムアウト値を表している場合。アグリゲーターは、述語が true を返すかタイムアウトになるまで、着信メッセージを受け入れて収集します。集約が完了すると (タイムアウトによるものも含む)、受信したすべてのメッセージが、集約がタイムアウトしたかどうかを示すフラグと共に宛先に送信されます。

コードはここに含めるには少し大きすぎ、オープン ソースではありません。

これが機能するためには、システムを介して伝播するメッセージにActorRef、応答メッセージの送信先を示す が含まれている必要があります (私は、 にのみ応答するアクターを設計することはめったにありませんsender)。

replyToメッセージ値のフィールドを として定義し、 「複数の受信者への送信」演算子を有効にするクラスをActorRef*使用することがよくあります。これには、(Option[ActorRef] または Seq[ActorRef] を使用する場合と比較して) メッセージ構築における構文のクリーンさの利点があり、同等のオーバーヘッドがあります (リプライ先のアクター ref または refs をキャプチャするために何かの構築を必要とします)。MulticastActor!*

とにかく、これらの機能を使用すると、非常に柔軟なルーティング トポロジを設定できます。

于 2013-10-10T17:41:55.123 に答える