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]
}
}
Haben Sie versucht, 'akka.cluster.auto-down-unreachable-after' zu einem Timeout (z. B. 10 sec) zu setzen? – Horusiath
Tks @ Horusiath! –