Я пытаюсь использовать Akker.Net Cluster Tools, чтобы использовать поведение Singleton и, кажется, работает отлично, но только когда текущий синглтон-узел " хост "изящно оставляет кластер. Если я внезапно выключу узел узла, передача обслуживания не произойдет.Akka.Net cluster singleton - хэндовер не возникает, когда текущее одноточечное выключение компьютера неожиданно
фон
Я строю систему, которая будет состоять из четырех узлов (на начальном этапе). Один из этих узлов будет «координатором рабочих», и он будет отвечать за мониторинг некоторых данных из базы данных и, при необходимости, отправлять рабочие места другим работникам. Я подумывал подписаться на события кластера и использовать событие изменения роли, чтобы сделать актера (на узле лидера), чтобы стать координатором, но я думаю, что Cluster Singleton будет лучшим выбором в этом случае.
Работа образца (но только если я грациозно покинуть кластер)
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();
}
Конфигурация
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]
}
}
Вы пытались установить 'akka.cluster.auto-down-unreachable-after' до некоторого таймаута (например, 10 секунд)? – Horusiath
Tks @Horusiath! –