2017-08-02 127 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; 
     } 
    } 
} 

在i創建一個羣集節點和一個客戶端的樣品工作。 如果我嘗試創建多個羣集節點,它們相互連接,然後直接dissasociate和羣集崩潰。

如果我評論兩個folling行集羣的工作,但機制接待員/客戶端不起作用。

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

他們的配置是否丟失?

回答

1

今天我只是有同樣的問題,並設法通過改變線序列化,而不是默認的Json來解決它。

我不得不從的NuGet在配置添加Akka.Serialization.Wire和更新序列化綁定,你可以看到這在Cluster Tools Example

+1

由於使用了很多。順便說一下,它也與Akka.Serialization.Hyperion一起工作。 –