12

Akka/Scala でブロードキャスター ルーターにルートを追加/削除する良い方法をご存知ですか?

私は Resizer を見てきましたが、私のニーズを満たしていません (Resizer にサイズ変更 (ルートの追加) を明示的に要求する方法がわかりません。削除するには、アクターに Poison Pill を送信してから削除する必要があるようです)。 )。

これまでのところ、ActorRef のリストを持つルーターがあり、AddRoutee および RemoveRoutee メッセージを送信しています....

私のビジネスケース: ネットワークから (プロキシ経由で) データを取得するアクターがいて、並列処理のためにこのデータを独立したアクターにディスパッチする必要があります。受信者 (DAG) のグラフの性質により、グラフは実行時に進化し、頂点/エッジが変更される可能性があるため、ルートを追加および削除する必要があります

これを行うには、よりクリーンな方法が必要です。

ポインタをありがとう。

Akka に処理してもらいたいコードの例:

 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)
  }
}
4

2 に答える 2

1

ルートに関する状態を保持し、変更のたびに新しいルーターを構築するか、ルーターを使用せずに単純なアクターを使用するよりも良い方法があるかどうかはわかりません。私も最近これを見ました。

不変性を支持する - したがって、支持される解決策は、おそらく古いルーターやコレクションを捨てて、新しいもの (ルーターまたはアクターのセット/マップ) を構築することです。

アクターを追跡するだけで、ルーターをまったく使用しないこともできます。これは優れたソリューションであり、akka のドキュメントでは、ルーターのより簡単な代替手段として推奨されています。ルーターは、本格的なアクターよりもパフォーマンス上の利点があると考えられています。

ここに示すように、アクターのリストを使用してルーターを構築できます。変更があるたびにこれを行うだけです。(ソース: 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)))

ここでは RoundRobin ルーターを示していますが、これはブロードキャスト ルーターを使用する場合と何ら変わりはありません。

これを再現するのはもう少し機能的です。

于 2013-05-21T17:05:03.630 に答える