1

クラスター グループ ルーターを構成しようとしていますが、これがどのように機能するかについての前提を確認したいと考えていました。

クラスター内に 2 つの個別のノードがあり、これらには次のロール「mainservice」と「secondservice」があります。「mainservice」内で、ラウンド ロビン グループ ルーターを使用して「secondservice」内のアクターにメッセージを送信したいと考えています。

akka hocon 構成では、 akka.actor.deployment セクション内に次のものがあります。

/secondserviceproxy {
       router = round-robin-group
       routees.paths = ["/user/gateway"]
       nr-of-instances = 3
       cluster {
        enabled = on
        allow-local-routees = off
        use-role = secondservice
       }
}

ドキュメントに基づく私の仮定は、「mainservice」に「secondserviceproxy」アクターを作成できるということです。これは、「secondservice」の実行中のインスタンスへのメッセージのルーティングをラウンドロビン ベースで処理します。

var secondServiceProxy = Context.System.ActorOf(Props.Empty.WithRouter(FromConfig.Instance), "secondserviceproxy");
secondServiceProxy.Tell("Main Service telling me something");

また、routees.path プロパティは、"/user/gateway" のようなアクター階層にある "secondservice" 内のアクターにメッセージが送信されることを意味すると仮定しました。

私の作業仮定は正しいですか?この実装では、「secondservice」で結果が得られないためです。

4

1 に答える 1

1

あなたの仮定は正しいです。おそらく起こっていることは、ルーターがクラスターの周りにルートのルートテーブルを構築する機会を得る前に、メッセージがクラスタールーターを介してブラストされていることです (クラスターゴシップの監視から構築されます)。

結果?あなたのメッセージは、最初は で終わっていDeadLettersます。その後、クラスターが完全に形成されると、ルーターはクラスター内の意図した受信者を認識しているため、通過します。

必要に応じて、そのアクターからのデッド レターを購読し、メッセージの送信先かどうかを確認することで、それを確認できます。次のようにできます。

using Akka.Actor;
using Akka.Event;

namespace Foo {
  public class DeadLetterAwareActor : ReceiveActor {
    protected ILoggingAdapter Log = Context.GetLogger();

    public DeadLetterAwareActor() {
      // subscribe to DeadLetters in ActorSystem EventStream
      Context.System.EventStream.Subscribe(Self, typeof(DeadLetter));
      Receiving();
    }

    private void Receiving() {
      // is it my message being delivered to DeadLetters?
      Receive<DeadLetter>(msg => msg.Sender.Equals(Self), msg => {
        Log.info("My message to {0} was not delivered :(", msg.Recipient);
      })
    }
  }
}
于 2015-09-28T20:18:25.283 に答える