2

我正在尝试 Akka.Net Cluster Tools,以使用 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]
    }
}
4

2 回答 2

1

谢谢@Horsiath,您的回答完全正确!我无法在 akka.net 文档中找到此配置,也没有意识到我应该查看 akka 文档。非常感谢!

您是否尝试将 akka.cluster.auto-down-unreachable-after 设置为某个超时(例如 10 秒)?– Horusiath 8 月 12 日 11:27

于 2016-08-19T01:27:34.183 回答
1

发布它作为对那些发现这篇文章的人的谨慎回应。

不建议在集群环境中使用自动关闭,因为系统的不同部分可能会在一段时间后决定另一部分关闭,将集群分成两个集群,每个集群都有自己的集群单例。

相关 akka 文档:https ://doc.akka.io/docs/akka/current/split-brain-resolver.html

于 2020-12-15T16:07:44.783 回答