4

リモート要求を受け入れ、処理を行い、応答を返すサービスに Akka.Net アクター システムを実装しました。システム内の一部のアクターには、データベースに永続化される状態があります。アクター システムが起動すると、これらのアクターはデータベースから状態を読み取ることによって水和します。

リクエストが来ると、アクターはオンデマンドで遅延ロードされ、メモリに常駐してさらなるリクエストを処理します。

現在、可能な限り簡単な方法で冗長性を提供する方法を検討しています。

ここでの最も簡単な解決策は、サービスの 2 つ目のコピーを「コールド」スタンバイにすることだと思います。最初のノードがダウンすると、リクエストは 2 番目のノードにルーティングされます。これにより、アクターの作成とデータベースからの状態の取得が開始されます。

その後、元のノードは起動時に「プライマリ」ではないことを認識し、すべてのアクターを終了する必要があります (アクティブになったときにディスクから状態を読み取れるようにするため)。

これを達成する最善の方法は何ですか?Akka.Cluster を使用して、ノードがいつクラスターに参加または離脱するかをリッスンする必要があると思いますか? しかし、すべてのメッセージが基本的に 1 つのノードに送信される必要があるとは、どのように言えばよいのでしょうか? ある種のリーダー選出プロセスはありますが、クラスター全体ではなく個々の役割のためのものですか?

これを行うためのより良い/簡単な方法はありますか?

4

1 に答える 1

0

私は akka.net を使用する初心者ですが、Akka.Net Cluster + SingletonActor を使用できると思います。ここでいくつかのテストを行っていますが、非常にうまく機能しているようです。

サンプル:

    private void Start() {
        var system = ActorSystem.Create("SingletonActorSystem");
        var cluster = Cluster.Get(system);
        cluster.RegisterOnMemberRemoved(() => MemberRemoved(system));

        var actor = system.ActorOf(ClusterSingletonManager.Props(
            singletonProps: Props.Create<ProcessorCoordinatorActor>(),
            terminationMessage: PoisonPill.Instance,
            settings: ClusterSingletonManagerSettings.Create(system)),
            name: "processorCoordinator");

        Console.ReadLine();

        cluster.Leave(cluster.SelfAddress);
        _leaveClusterEvent.WaitOne();
    }

    private async void MemberRemoved(ActorSystem actorSystem) {
        await actorSystem.Terminate();
        _leaveClusterEvent.Set();
    }

構成:

    akka {
        suppress-json-serializer-warning = on

        actor {
            provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"
        }

        remote {
            helios.tcp {
                port = 0
                hostname = localhost
            }
        }

        cluster {
            auto-down-unreachable-after = 5s
            down-removal-margin = 5s
            seed-nodes = [ "akka.tcp://SingletonActorSystem@127.0.0.1:4053" ] 
            roles = [worker]

            singleton {
                singleton-name = "processorCoordinator"
                role = "worker"
                hand-over-retry-interval = 5s
            }
        }
    }
于 2016-08-08T02:12:32.680 に答える