我正在阅读akka文档,并提出了一些问题,包括他们实施 Gossip 的方式。 (docs here)。困扰我的那部分,(强调我的):
定期,默认值为每1秒,每个节点选择另一个节点 随机节点发起一轮八卦。 如果小于½ 节点驻留在看到的集合中(已经看到新状态),然后是 群集闲话3次,而不是每秒一次。 经过调整 八卦间隔是一种加速收敛过程的方法 国家改变后的早期传播阶段。
因此,如果八卦轮在开始时(少于1/2个节点已经看到当前状态),则来自所见集的节点开始发送3个八卦而不是一个。但如果八卦融合发生了,他们怎么知道呢(他们仍然每秒发送三次八卦)。或者也许整个集群中的融合就像任何其他“集群事件”一样?
答案 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)
一旦群集收敛,它将使用配置的八卦间隔回退到正常的预定八卦滴答。请查看此功能的source和test specs。希望这可以帮助。
答案 1 :(得分:2)
正如您在other question中回答的节点闲话时,它们包括哪些其他节点已经看到此更新。
请注意,八卦随机选择要闲聊的节点。虽然该系统实现了加权随机,但优先于尚未看到更新的节点,但节点仍然可以闲聊到不看到更新的其他节点。当发生这种情况时,在一对闲聊节点上更新看到的集合。
节点基本上是在闲谈价值,然后闲聊谁看到了价值。为简单起见,该协议实际上将这两个概念捆绑在一起。