在 akka 集群中关闭 node/member 的正确方法

proper way to down a node/member in akka cluster

当节点在 akka 集群中变得不可访问时,是否有任何正确的方法来关闭节点。我想在节点变得无法访问时公开 api 以关闭节点,但我更喜欢以编程方式找到另一种方式或其他方式。自动关闭不再是一种选择,因为我一直有脑裂问题。

我可以直接在 receive 方法中关闭节点吗:

def 接收:接收 = { case MemberUp(成员) =>

case UnreachableMember(member) => {      
  Cluster(context.system).down(member.address)
}

如果节点崩溃了,在任何其他节点上关闭它都可以。

但是你必须这样做作为对看到它无法访问的反应,如果它是一个网络分区而不是一个节点崩溃,那么这将导致脑裂,分区的每一侧都将看到集群的其余部分无法到达并向下移动所有这些,您最终会得到两个集群,认为它们已经关闭了另一侧。

这就是我们在 Akka 2.6 中删除自动关机的确切原因

如果您想自动删除具有裂脑分辨率的节点,您将需要 use/implement 一个为您处理的关闭提供程序。

自己实现一个 downing provider 需要相当多的努力和思考。有关该问题的更多背景信息,您可以在此处阅读商业 Lightbend SBR 的文档:https://doc.akka.io/docs/akka-enhancements/current/split-brain-resolver.html