节点如何知道哪些节点已经看到集群当前状态?

use*_*882 5 java scala distributed-system akka gossip

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

\n\n
\n

周期性地,默认是每1秒,每个节点选择另一个随机节点来发起一轮八卦。如果少于\xc2\xbd 的\n 节点位于已见集合中(已经看到新状态),则\n 集群闲话3 次,而不是每秒一次。这种调整后的八卦间隔是在状态改变后的早期传播阶段加速收敛过程的一种方法。

\n
\n\n

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

\n

Lak*_*gha 3

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

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)
Run Code Online (Sandbox Code Playgroud)

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