2016-03-23 23 views
3

リモートリクエストを受け入れ、処理して返信するサービスにAkka.Netアクターシステムを実装しました。システム内のアクターの中には、データベースに保存される状態があります。アクターシステムが起動すると、これらのアクターはデータベースから状態を読み取ることで水和状態になります。Akka.Netの冗長性とフェイルオーバーの処理

要求が到着すると、アクタは要求に応じて遅延ロードされ、メモリに常駐して以降の要求を処理します。

ここでは、できるだけ簡単に冗長性を提供する方法を検討しています。

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

その後、元のノード、それが起動したとき、その「主」ではないことを認識し、(それがアクティブになったとき、それはディスクからそれらの状態でそれらを読み返すことができるように)すべての俳優を終了する必要がある

は何ですかこれを達成するのに最適なのでしょうか? 私はAkka.Clusterを使用して、ノードがクラスタに参加する、またはクラスタから離れるときにリッスンする必要があると思います。しかし、すべてのメッセージは基本的に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://[email protected]:4053" ] 
      roles = [worker] 

      singleton { 
       singleton-name = "processorCoordinator" 
       role = "worker" 
       hand-over-retry-interval = 5s 
      } 
     } 
    } 
関連する問題