Akka.Net 集群单例 - 当前单例节点意外关闭时不会发生切换
Akka.Net cluster singleton - handover not occurs when current singleton node shutdown unexpectedly
我正在尝试 Akka.Net 集群工具,以便使用单例行为,它似乎工作得很好,但就在当前单例节点 "host" 以优雅的方式离开集群时.如果我突然关闭主机节点,则不会发生切换。
背景
我正在构建一个将由四个节点组成的系统(最初)。其中一个节点是 "workers coordinator",它将负责监控数据库中的一些数据,并在必要时将作业提交给其他工作人员。本来想订阅集群事件,利用leader角色变更事件让actor(在leader节点上)成为coordinator,但我觉得这种情况下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://SingletonActorSystem@127.0.0.1:4053"]
roles = [worker]
}
}
谢谢@Horusiath,你的回答完全正确!我无法在 akka.net 文档中找到此配置,而且我没有意识到我应该查看 akka 文档。非常感谢!
Have you tried to set akka.cluster.auto-down-unreachable-after to some timeout (eg. 10 sec)? – Horusiath Aug 12 at 11:27
将其发布作为对发现此问题的人的警告 post。
不建议在集群环境中使用自动关闭,因为系统的不同部分可能会在一段时间后决定另一部分关闭,将集群分成两个集群,每个集群都有自己的集群单例。
相关的 akka 文档:https://doc.akka.io/docs/akka/current/split-brain-resolver.html
我正在尝试 Akka.Net 集群工具,以便使用单例行为,它似乎工作得很好,但就在当前单例节点 "host" 以优雅的方式离开集群时.如果我突然关闭主机节点,则不会发生切换。
背景
我正在构建一个将由四个节点组成的系统(最初)。其中一个节点是 "workers coordinator",它将负责监控数据库中的一些数据,并在必要时将作业提交给其他工作人员。本来想订阅集群事件,利用leader角色变更事件让actor(在leader节点上)成为coordinator,但我觉得这种情况下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://SingletonActorSystem@127.0.0.1:4053"]
roles = [worker]
}
}
谢谢@Horusiath,你的回答完全正确!我无法在 akka.net 文档中找到此配置,而且我没有意识到我应该查看 akka 文档。非常感谢!
Have you tried to set akka.cluster.auto-down-unreachable-after to some timeout (eg. 10 sec)? – Horusiath Aug 12 at 11:27
将其发布作为对发现此问题的人的警告 post。
不建议在集群环境中使用自动关闭,因为系统的不同部分可能会在一段时间后决定另一部分关闭,将集群分成两个集群,每个集群都有自己的集群单例。
相关的 akka 文档:https://doc.akka.io/docs/akka/current/split-brain-resolver.html