8

Scala でブロードキャスト ルーターを使用しようとしています。間違っていなければ、次のようになります。

val system = ActorSystem("My beautiful system")
val workerRouter = system.actorOf(Props[Agent].withRouter(BroadcastRouter(individualDefinitions.size)), name = "agentRouter")

それは、私がフォローしているチュートリアルから理解していることです。

workerRouter は別のアクターとして機能し、このルーターにメッセージを送信して、すべての Agent (個人の定義と同じ数) にメッセージを送信できます。

問題は、個々の定義を使用してエージェントを構築したいということです。エージェントは実際にはコンストラクターでいくつかのパラメーターを取り、それらのパラメーターは個々の定義に含まれています。

Q:コンストラクターの一部としてこれらのパラメーターをそれぞれに渡すようにルーターに指示するにはどうすればよいですか?

各アクターは 1 つの個別の定義を取得する必要があり、それらはすべて異なることに注意してください。コンストラクターが定数を受け取る関連する質問でソリューションを使用できません: Akka Java アクター モデルでは、ルーターはデフォルト以外のコンストラクターでアクターを作成できますか?

ここで、各アクターは異なるパラメーターを持つ必要があることに注意してください。そのうちの 1 つが再起動された場合、最初に取得したものと同じパラメーターを取得する必要があります。それを行うためにそのソリューションを変更できるかどうかはわかりません。

考えられる解決策は、アクターをルーターとして使用して、作成 (コンストラクター) とルーティングを分離することです。問題のAkka (java) のように、すべての children へのブロードキャストをブロックしません

この場合、それが「正しい」アプローチであるかどうかはわかりません。アクターをルーターとして使用することには、いくつかの問題があります (エレガンス以外にも)。ルーターとして機能するアクターが再起動され、すべてのサブスクライバーが失われることを懸念しています。アクターがループの半分で再起動された場合、私の間違いでなければ、一部のアクターはいくつかのメッセージを見逃す可能性もあります。

ありがとうございました。

4

2 に答える 2

0
public class Master extends UntypedActor {
     -----
     -----
    public Master() {
        workerRouter = this.getContext().actorOf(Worker.createWorker().withRouter(new RoundRobinRouter(8)), "workerRouter");
    }

Akka 2.4.2 では、以下を簡単に使用できます。

workerRouter = this.getContext().actorOf(new RoundRobinPool(noOfWorkers).props(Props.create(Worker.class)), "workerRouter");

これは、最小で実行されるベスト エフォート コードです。akka の時間。

于 2014-09-19T09:39:50.997 に答える