首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当存在单例时,如何在akka集群中配置关闭

当存在单例时,如何在akka集群中配置关闭
EN

Stack Overflow用户
提问于 2015-06-01 21:43:06
回答 1查看 1.8K关注 0票数 12

我在Akka的documentation中读到,当使用集群单例时,应该避免使用自动关闭。我不明白在这种情况下应该如何配置downing。我知道我可能会订阅集群成员活动,并根据这些消息计划我的策略。然而,我不明白它在实际中与自动关闭有什么不同。

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

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-06-04 13:40:17

看看下面的代码。正如医生所说,我已经关闭了auto-down-unreachable-after功能。相反,我实现了一个与普通逻辑略有不同的自定义逻辑。下面代码的关键是,如果发生网络分区,只有拥有多数的集群节点将在一些可配置的5秒后关闭UnreachableMember。另一方面,少数群集节点将其UnreachableMember (即大多数组)作为unreachable,而不是将它们关闭以形成孤岛。多数数的概念借鉴了MongoDB,我认为这在计算机科学领域并不新鲜。

代码语言:javascript
运行
复制
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")
  }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30575174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档