2017-08-02 1 views
0

J'essaie de créer un exemple qui crée un cluster capable de traiter un ordre et un client qui envoie un ordre. Pour ce faire, j'utilise ClusterClientReceptionist et ClusterClient pour communiquer entre un client et un réseau de clusters.Akka.Net ClusterClientReceptionist crash multinode

Cluster Code Node:

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; 
     } 
    } 
} 

code côté client:

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; 
     } 
    } 
} 

Lorsque je crée un nœud de cluster et un client le travail de l'échantillon. Si j'essaie de créer plusieurs nœuds de cluster, ils se connectent les uns aux autres puis se dissocient directement et le cluster est réduit.

Si je commente les deux lignes suivantes, le cluster fonctionne mais le mécanisme Réceptionniste/Client ne fonctionne pas.

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

Leur configuration manquante?

Répondre

1

Je venais d'avoir le même problème aujourd'hui et j'ai réussi à le réparer en passant à la sérialisation des fils au lieu du Json par défaut.

je devais ajouter Akka.Serialization.Wire de NuGet et mettre à jour les liaisons de sérialisation dans la configuration, vous pouvez le voir utilisé dans les Cluster Tools Example

+1

Merci beaucoup. Par ailleurs, il fonctionne avec Akka.Serialization.Hyperion aussi. –