2013-05-20 17 views
11

ブロードキャストルータにルートを追加/削除するには、Akka/Scalaの便利な方法をご存知でしょうか?ルータのアクタに経路を動的に追加/削除する

私はResizerを見ていましたが、私のニーズを満たしていませんでした(私はresizerに経路を追加するよう明示的に要求する方法は見当たりませんし、それを取り除くにはPoison Pillをその後除去される)。

これまでのところ、

私のビジネスケース ....私はActorRefのリストを持つルータを持っていると私はAddRouteeとRemoveRouteeメッセージを送信:私はプロキシ経由(ネットワークからデータを取得する俳優を持っています)、このデータを独立したアクターにディスパッチして並列処理する必要があります。受信者(DAG)のグラフの性質上、グラフは実行時に進化し、頂点/辺が変更されるため、ルートを追加したり削除したりする必要があります。

これを行うにはもっとクリーンな方法が必要です。

ありがとうございます。

私はアッカが処理したいコードの例:

class MDActor extends Actor { 
    @volatile var routees = Set[ActorRef]() 

    def receive = { 
    case ar: AddRoutee => routees = routees + ar.actorRef 
    case rr: RemoveRoutee => routees = routees - rr.actorRef 
    case msg => routees.foreach(r => r forward msg) 
    } 
} 
+0

コードからルータへのルートの追加/削除を行う状況を少し詳しく説明できますか?そのような情報は、ソリューションの開発に役立ちます。 – cmbaxter

+1

あなたの例では、ルートの重複を防ぐためにList [ActorRef]の代わりにSet [ActorRef]を使用することをお勧めします。そして、 "!"の代わりに "forward"を使用してください。元の送信者を保存します。 –

+0

ありがとうございます。これは素晴らしい考えです。 – jts

答えて

2

ルーターの機能が不足している場合は、他の方向に向かって考え始めるのがよいでしょう。存在するアクターコードは何ですか? 1秒間に数百万件以上のメッセージをルーティングする必要がある場合を除いて(あなたの説明によればそうは思わない)、そのような俳優は正確な解決策です。ルーターは非常に特殊な構成であり、代わりに使用すべきではありません。彼らがあなたの要件を正確に満たしている場合にのみ使用し、通常のアクターでは十分ではないとベンチマークしました。

+0

Roland、私の使用例は非常に具体的です.. "java"でも。したがって、上記のパターンは、私のコードがしたいものに対してうまく機能します。確かに、私はそれをJavaのやり方でやっていたかもしれません...それで何が楽しいでしょうか? – jts

+0

私はこのコメントを理解していません。私の答えは「あなたはそれを理解した、探していない」という意味になっています;-) –

+0

いいえ。いつもより良い方法があるかどうか探しています:-) – jts

1

わからない本当にrouteesについての状態を維持し、すべての変更に新しいルータを構築したり、使用しないためのより良い方法がありますルーターを使用し、プレーンアクターを使用します。私は最近これも見ました。

不変性 - 好都合な解決策は、古いルータやコレクションを捨てて、新しいルータ(ルータやルータのセット/マップ)を構築することです。

あなたはアクターを追跡して、ルータをまったく使用しないことができます。これは良い解決策であり、akkaドキュメントではルータのより簡単な代替手段として推奨されています。ルーターは、フル吹き出しの俳優に比べてパフォーマンスの優位性があると考えられています。

ここに示すように、俳優のリストを使ってルータを構築することができます。 変更があるたびにこれを行うだけです。 (ソース:アッカドキュメント - http://doc.akka.io/docs/akka/snapshot/scala/routing.html

val actor1 = system.actorOf(Props[ExampleActor1]) 
val actor2 = system.actorOf(Props[ExampleActor1]) 
val actor3 = system.actorOf(Props[ExampleActor1]) 
val routees = Vector[ActorRef](actor1, actor2, actor3) 
val router2 = system.actorOf(Props().withRouter(
    RoundRobinRouter(routees = routees))) 

ここでは、ラウンドロビンルータを示していますが、それは放送1を使用するよりも何が違うのではないのです。

これを再作成するにはもう少し機能があります。

+0

これは実際に動作しますか?ルータをインスタンス化する際にエラーが発生しています。 – mbseid

+0

あなたが使用しているakkaのバージョンと一致していることを確認してください:)また、Roland Kuhn氏のみが答えました:)オーケストレーション/コミュニケーションライブラリを構築するときにランダムに送ったactor refの配列を再作成しました。ルータを再作成することも可能です。 – JasonG

+0

Gotcha。私は上記のステートメントの実際のコンパイルをもっと見ていました。私はProps.emptyを使用しなければならなかった。それはおそらくバージョンのものでした。 – mbseid

関連する問題