2017-08-02 9 views
0

注文を処理できるクラスタと注文を送信するクライアントを作成するサンプルを作成しようとしています。Akka.Net ClusterClientReceptionistマルチノードクラッシュ

これを行うには、ClusterClientReceptionistとClusterClientを使用して、クライアントとクラスタネットワーク間で通信します。

クラスタノードコード:

namespace ClusterNode 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      bool isFirst = false; 
      using (var mutex = new Mutex(false, "5D14E338-616C-4637-93E7-E59D152DC005", out isFirst)) 
      { 
       using (var system = ActorSystem.Create(nameof(Order), CreateConfig(isFirst))) 
       { 
        var receptionistConfig = ClusterClientReceptionist.DefaultConfig(); 
        system.Settings.InjectTopLevelFallback(receptionistConfig); 

        ClusterRouterPoolSettings settings = new ClusterRouterPoolSettings(int.MaxValue, 1, true); 
        ClusterRouterPool pool = new ClusterRouterPool(new Akka.Routing.RoundRobinPool(1), settings); 

        var aref = system.ActorOf(pool.Props(Props.Create<OrderProcessor>()), nameof(OrderProcessor)); 

        var receptionist = ClusterClientReceptionist.Get(system); 
        receptionist.RegisterService(aref); 

        system.WhenTerminated.Wait(); 
       } 
      } 
     } 

     private static Config CreateConfig(bool isFirst) 
     { 
      var configString = "akka { actor.provider = \"Akka.Cluster.ClusterActorRefProvider, Akka.Cluster\"\n"; 

      var port = (isFirst) ? 8082 : 0; 

      configString += "remote { helios.tcp { hostname = localhost, port = " + port + " } }\n"; 
      configString += "cluster {\n seed-nodes = [\"akka.tcp://" + nameof(Order) + "@localhost:8082\"] \n"; 
      configString += "}\n"; 
      configString += "}"; 
      var config = ConfigurationFactory.ParseString(configString); 
      return config; 
     } 
    } 
} 

クライアント側コード:

namespace Client 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var system = ActorSystem.Create(nameof(Client), CreateConfig())) 
      { 
       system.Settings.InjectTopLevelFallback(ClusterClientReceptionist.DefaultConfig()); 
       var client = system.ActorOf(ClusterClient.Props(ClusterClientSettings.Create(system))); 

       bool quit = false; 
       while (!quit) 
       { 
        var str = Console.ReadLine(); 

        if (string.Equals(str, "QUIT", StringComparison.InvariantCultureIgnoreCase)) 
        { 
         quit = true; 
         continue; 
        } 

        Order order = new Order() { Msg = str }; 

        var respTask = client.Ask<Response>(new ClusterClient.Send("/user/OrderProcessor", order)); 
        respTask.Wait(); 

        Console.WriteLine(respTask.Result.ResponseMsg); 
       } 
       system.Terminate(); 
       system.WhenTerminated.Wait(); 
      } 
     } 

     private static Config CreateConfig() 
     { 
      var configString = "akka { actor.provider = \"Akka.Remote.RemoteActorRefProvider, Akka.Remote\"\n"; 
      configString += "remote { helios.tcp { hostname = localhost, port = 0 } }\n"; 
      configString += "cluster {\n seed-nodes = [\"akka.tcp://" + nameof(Order) + "@localhost:8082\"], "; 
      configString += " client { initial-contacts : [ \"akka.tcp://" + nameof(Order) + "@localhost:8082/system/receptionist\" ] }"; 
      configString += " }\n"; 
      configString += "}"; 
      var config = ConfigurationFactory.ParseString(configString); 
      return config; 
     } 
    } 
} 

私は1つのクラスタノードと1つのクライアントのサンプルワークを作成します。 私は複数のクラスタノードを作成しようとすると、それらはお互いに接続し、直接dissociateし、クラスタは崩壊しました。

もし私が2つのフォールリング・ラインにコメントすると、クラスタは動作しますが、Receptionist/Clientの仕組みは動作しません。

var receptionist = ClusterClientReceptionist.Get(system); 
receptionist.RegisterService(aref);    

設定が不足していますか?

答えて

1

今日は同じ問題が発生していて、デフォルトのJsonの代わりにWire serializationに変更することで修正できました。

私はNuGetからAkka.Serialization.Wireを追加し、設定でシリアル化のバインディングを更新しなければならなかった、あなたはこれがCluster Tools Example

+1

おかげでたくさんの中で使用されて見ることができます。ところで、Akka.Serialization.Hyperionでも動作します。 –

関連する問題