5

我正在阅读 akka 文档,并在理解他们实现Gossip的方式时遇到了一些麻烦。(此处的文档)。让我感到困惑的部分,(强调我的):

周期性地,默认是每 1 秒,每个节点选择另一个随机节点来发起一轮八卦。如果少于 1/2 的 节点驻留在已看到的集合中(已看到新状态),则 集群会闲聊 3 次,而不是每秒一次。这种调整后的八卦间隔是在状态变化后的早期传播阶段加速收敛过程的一种方式。

因此,如果八卦轮处于开始阶段(少于 1/2 个节点已经看到当前状态),则来自所见集合的节点开始每秒发送 3 个八卦,而不是一个。但是,如果八卦收敛发生了,他们怎么知道(他们仍然保持每秒发送 3 次八卦)。或者,可能会像任何其他“集群事件”一样在整个集群中传播收敛?

4

2 回答 2

3

正如您可能知道的那样,当所有节点都被看到时(即所有成员节点都在 Gossip 事件的已看到列表中),就会发生八卦收敛。如果集群不收敛,ClusterDeamon 会加速 gossip。

def gossipTick(): Unit = {
    gossip()
    if (isGossipSpeedupNeeded) {
      scheduler.scheduleOnce(GossipInterval / 3, self, GossipSpeedupTick)
      scheduler.scheduleOnce(GossipInterval * 2 / 3, self, GossipSpeedupTick)
    }
  }

def isGossipSpeedupNeeded: Boolean =
    (latestGossip.overview.seen.size < latestGossip.members.size / 2)

集群收敛后,它会使用配置的八卦间隔回退到正常的预定八卦滴答声。查看此功能的源代码测试规范。希望这可以帮助。

于 2016-09-11T16:59:47.807 回答
2

正如您在其他问题中回答的那样,当节点八卦时,它们包括哪些其他节点已经看到此更新。

请注意,八卦随机选择八卦到哪个节点。尽管该系统对尚未看到更新的节点实施了加权随机,但节点仍然可以向其他尚未看到更新的节点发送消息。当这种情况发生时,所见集会在这对闲话节点上更新。

节点本质上是在八卦价值,然后八卦谁看到了价值。为了简单起见,该协议实际上将这两个概念捆绑在一起。

于 2016-09-12T07:15:04.453 回答