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

时间:2016-09-11 16:26:26

标签: java scala akka distributed-system gossip

我正在阅读akka文档,并提出了一些问题,包括他们实施 Gossip 的方式。 (docs here)。困扰我的那部分,(强调我的):

  

定期,默认值为每1秒,每个节点选择另一个节点   随机节点发起一轮八卦。 如果小于½   节点驻留在看到的集合中(已经看到新状态),然后是    群集闲话3次,而不是每秒一次。 经过调整   八卦间隔是一种加速收敛过程的方法   国家改变后的早期传播阶段。

因此,如果八卦轮在开始时(少于1/2个节点已经看到当前状态),则来自所见集的节点开始发送3个八卦而不是一个。但如果八卦融合发生了,他们怎么知道呢(他们仍然每秒发送三次八卦)。或者也许整个集群中的融合就像任何其他“集群事件”一样?

2 个答案:

答案 0 :(得分: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)

一旦群集收敛,它将使用配置的八卦间隔回退到正常的预定八卦滴答。请查看此功能的sourcetest specs。希望这可以帮助。

答案 1 :(得分:2)

正如您在other question中回答的节点闲话时,它们包括哪些其他节点已经看到此更新。

请注意,八卦随机选择要闲聊的节点。虽然该系统实现了加权随机,但优先于尚未看到更新的节点,但节点仍然可以闲聊到看到更新的其他节点。当发生这种情况时,在一对闲聊节点上更新看到的集合。

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