如何在存在单例时配置akka集群中的downing

Miz*_*izh 12 singleton akka akka-cluster

我在Akka的文档中读到,当使用群集单例时,应该避免使用自动下载.我不明白在这种情况下如何配置downing.我知道我可以订阅集群成员资格事件并根据这些消息规划我的策略.但是,我不明白它与自动降落有什么不同.

当某个节点以某种方式从群集中分区时,如果使用自动下载,则分区节点将"认为"整个群集丢失并启动它自己的群集(具有自己的单例).但是,另一方面,我无法将无法到达的节点永远保持在无法到达的状态,因为群集将无法达到收敛(新节点将无法加入),并且如果分区节点本身是单身自身的新单例节点根据我的理解,不会被分配,因此,剩下要做的唯一事情就是在一些宽限时间之后删除无法访问的节点,这正是自动下载所做的.

我在这里想念什么?

min*_*uno 1

查看下面的代码。auto-down-unreachable-after我已经按照医生所说关闭了该功能。相反,我实现了一个与正常有点不同的自定义逻辑。UnreachableMember下面代码的关键是,如果发生网络分区,只有占多数的集群节点才会在可配置的 5 秒后关闭。另一方面,少数集群节点将遵循他们的UnreachableMember(即多数群体),unreachable并且不会将它们打倒形成孤岛。多数数量的想法是从 MongoDB 借用的,我认为这并不新鲜在计算机科学领域。

class ClusterListener extends Actor with ActorLogging {

  val cluster = Cluster(context.system)
  var unreachableMember: Set[Member] = Set()

  // subscribe to cluster changes, re-subscribe when restart 
  override def preStart(): Unit = {
    //#subscribe
    cluster.subscribe(self, initialStateMode = InitialStateAsEvents, classOf[UnreachableMember], classOf[ReachableMember])
    //#subscribe
  }
  override def postStop(): Unit = cluster.unsubscribe(self)

  def receive = {
    case UnreachableMember(member) =>
      log.info("Member detected as unreachable: {}", member)
      val state = cluster.state
      if (isMajority(state.members.size, state.unreachable.size)) {
        scheduletakeDown(member)
      }
    case ReachableMember(member) =>
      unreachableMember = unreachableMember - member
    case _: MemberEvent => // ignore
    case "die" =>
      unreachableMember.foreach { member =>
        cluster.down(member.address)
      }
  }

  // find out majority number of the group
  private def majority(n: Int): Int = (n+1)/2 + (n+1)%2

  private def isMajority(total: Int, dead: Int): Boolean = {
    require(total > 0)
    require(dead >= 0)
    (total - dead) >= majority(total)
  }

  private def scheduletakeDown(member: Member) = {
    implicit val dispatcher = context.system.dispatcher
    unreachableMember = unreachableMember + member
    // make 5s config able!!!
    context.system.scheduler.scheduleOnce(5 seconds, self, "die")
  }

}
Run Code Online (Sandbox Code Playgroud)