2016-08-08 25 views
2

Ich versuche Akka.Net Cluster Tools, um das Singleton Verhalten zu verwenden und es scheint perfekt zu funktionieren, aber nur wenn der aktuelle Singleton Knoten " Host "verlässt den Cluster in einer anmutigen Weise. Wenn ich den Host-Knoten plötzlich herunterfahre, findet die Übergabe nicht statt.Akku.Net Cluster Singleton - Handover tritt nicht auf, wenn der aktuelle Singleton Knoten unerwartet heruntergefahren wird

Hintergrund

ich ein System baue, die (zunächst) durch vier Knoten zusammengesetzt werden. Einer dieser Knoten wird der "Arbeiterkoordinator" sein, und er wird dafür verantwortlich sein, einige Daten aus der Datenbank zu überwachen und, wenn nötig, Aufträge an die anderen Arbeiter zu senden. Ich dachte daran, Cluster-Ereignisse zu abonnieren und das Rollenleiter-Änderungsereignis zu verwenden, um einen Akteur (auf dem Führungsknoten) zu einem Koordinator zu machen, aber ich denke, dass der Cluster-Singleton in diesem Fall eine bessere Wahl wäre.

Arbeitsprobe (aber nur, wenn ich den Cluster anmutig verlassen)

private void Start() { 
    Console.Title = "Worker"; 

    var section = (AkkaConfigurationSection)ConfigurationManager.GetSection("akka"); 
    var config = section.AkkaConfig; 

    // Create a new actor system (a container for your actors) 
    var system = ActorSystem.Create("SingletonActorSystem", config); 
    var cluster = Cluster.Get(system); 
    cluster.RegisterOnMemberRemoved(() => MemberRemoved(system)); 
    var settings = new ClusterSingletonManagerSettings("processorCoordinatorInstance", 
     "worker", TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(1)); 

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

    string line = Console.ReadLine(); 

    if (line == "g") { //handover works 
     cluster.Leave(cluster.SelfAddress); 
     _leaveClusterEvent.WaitOne(); 
     system.Shutdown(); 
    } else { //doesn't work 
     system.Shutdown(); 
    } 
} 

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

Konfiguration

akka { 
    suppress-json-serializer-warning = on 

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

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

    cluster { 
     seed-nodes = ["akka.tcp://[email protected]:4053"] 
     roles = [worker] 
    } 
} 
+1

Haben Sie versucht, 'akka.cluster.auto-down-unreachable-after' zu einem Timeout (z. B. 10 sec) zu setzen? – Horusiath

+0

Tks @ Horusiath! –

Antwort

0

Danke @Horusiath, Ihre Antwort ist total richtig! Ich konnte diese Konfiguration nicht in der Dokumentation von akka.net finden, und mir war nicht klar, dass ich die Akka-Dokumentation sehen sollte. Vielen Dank!

Haben Sie versucht, akka.cluster.auto-down-unreachable-nach einigen Timeout (z. B. 10 Sekunden) zu setzen? - Horusiath 12. Aug um 11:27