【基础算法】Gossip协议

集群往往是由多个节点共同组成的,当一个节点加入集群或者一个节点从集群中下线的时候,都需要让集群中其他的节点知道,这样才能将数据信息分享给新节点而忽略下线节点。
在这里插入图片描述
A、B、C节点之间可以互相传递消息,但是D节点在下线之后会被广播告诉其他存活节点。

这样的广播协议就是今天要说Gossip协议,Gossip协议也叫Epidemic协议(流行病协议),当一个消息到来时,通过Gossip协议就可以像病毒一样感染全部集群节点,当然我们利用的是它这个极强的散播能力。

Gossip的过程是由一个种子节点发起的,当一个种子节点有信息需要同步到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。这个过程可能需要一定的时间,所以不能保证某个时间点所有的节点都有该条消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。

Gossip协议的特点:

Gossip协议是周期性散播消息,每隔一段时间传播一次
被感染的节点,每次可以继续散播N个节点
每次散播消息时,都会选择尚未发送过的节点进行散播
收到消息的节点,不会向发送的节点散播
同一个节点可能会收到重复的消息,因为可能同时多个节点正好向它散播

集群是去中心化的,节点之间都是平等的
消息的散播不用等接收节点的ack,即消息可能会丢失,但是最终应该会被感染

我们来看个例子:
在这里插入图片描述
种子节点是A
A节点选择B、C节点进行散播
C散播到D,B散播D和E,可以发现D收到两次
D散播到F,最终整个网络都同步到了消息

Gossip有点类似图的广度优先遍历算法,一般用于网络拓扑结构信息的分享和维护,像redis、consul都有使用到。

猜你喜欢

转载自blog.csdn.net/xiaowanzi_zj/article/details/121092385