技术圈的“绯闻女孩”:Gossip是如何把八卦秘密传遍全网的?

Gossip协议,中文可译为"流言蜚语""闲话"或"八卦",形象地描述了该协议的工作方式------类似于人类社会中的信息传播模式。Gossip协议最早由Xerox公司的Palo Alto研究中心(PARC)在一篇论文中提出,论文中将其称为八卦算法或病毒算法(Epidemic Algorithm),但最终"Gossip"这一名称被接受并沿用至今。 Gossip协议是一种去中心化的分布式协议,旨在实现多个节点之间的状态信息共享。其核心思想是通过随机选择节点进行信息交换,逐步将状态数据传播到整个系统。 在分布式系统中,元数据(Metadata)是描述系统状态的关键信息,例如节点负责的数据范围、主从关系、节点健康状态(是否故障)等。Gossip协议通过周期性的、轻量级的通信机制,确保这些元数据能够在节点间高效、可靠地同步。

Gossip 的基本工作模式

1)周期性活动: 每个节点定期(例如每秒)启动一轮Gossip。 2)随机对等选择: 节点从其已知的集群成员列表中随机选择一个或少数几个目标节点(通常是k个,k远小于总节点数N)。 3)信息交换: 节点向选中的目标节点发送其持有的部分或全部信息(例如,自身状态、已知的其他节点状态、元数据更新等),并从目标节点接收类似信息。 4)状态合并与更新: 节点根据接收到的信息更新本地状态。例如,如果收到的信息版本更新,则采纳新信息。

Gossip 的信息传播方式变体

Gossip协议主要是通过直接邮寄、反熵和谣言传播三种方式来实现数据的最终一致性。

直接邮寄

直接邮寄(Direct mail),当一个节点自身状态发生重要更新时(例如,它检测到一个新数据),它主动将这个更新推送给随机选择的邻居。这是信息快速传播的一种方式,但不保证送达。 如图所示:当节点A的数据更新时,会直接将新数据传给节点B、节点C,然后各个节点再更新自己的数据。

需要说明的是:当队列溢出或长时间无法访问其目的地时,消息可能会被丢弃,也就是说,只采用直邮的方式是无法实现最终一致性的。

反熵

反熵(Anti entropy/ Pull or Push-Pull style),中的熵是指混乱程度,在此处,熵可以理解成不同节点中数据的差异性。反熵就是指消除混乱程度,提升节点间数据的相似度,降低熵值。反熵主要有推、拉和推拉三种方式。

1)推方式,节点A定期选择节点B,将A的所有(或部分摘要)数据推送给B,让B修复其与A不一致的部分。

2)拉方式,节点A定期选择节点B,从B拉取其所有(或部分摘要)数据,修复A自身与B不一致的部分。

3)推拉方式,节点A选择节点B,双方交换数据并各自修复差异。这是最常见和鲁棒的方式。

反熵通过异步方式修复数据差异,可以实现"最终一致性",但是,节点之间需要相互交换和比较数据,如果集群节点数比较多且动态变化,代价就成直线上升(比如k8s环境中检测节点故障,并动态维护集群节点状态)。因此,反熵方式适合节点数固定且有限的集群实现数据一致性。

谣言传播

谣言传播(Rumor mongering/ Hot-stuff Propagation),当一个节点有"新"信息(谣言)时,它会积极地向其他节点传播。如果一个节点收到了它之前未曾听闻的谣言,它也会变成一个活跃的传播者,继续向外散播。为了避免谣言无限传播,可以设置传播次数上限,或者当一个节点发现其大多数邻居都已经知道这个谣言时,它就停止主动传播,转为仅在被询问时才告知(即从"活跃"转为"被动")。

bash 复制代码
// 定期执行,先随机选择集合S中的s1
// s1再随机选取集合S中的任意其他节点
// 不断解决两两之间的数据冲突
// 最终整个集合中的对象都会达成数据一致性
FOR SOME s1 belong to S DO
   ResolveDifference[S,s1)
 END LOOP

如图所示,当节点A有新数据时,会成为活跃节点,然后向集群中节点B,节点E传播该数据,节点C收到新数据之后也变成了活跃节点,然后向节点D传播新数据,这样其他节点都能更新到新数据。

未完待续

很高兴与你相遇!如果你喜欢本文内容,记得关注哦!!!

相关推荐
BingoGo1 小时前
PHP 如何利用 Opcache 来实现保护源码
后端·php
拳打南山敬老院2 小时前
漫谈 MCP 构建之Resources篇
前端·后端·ai编程
我不是混子2 小时前
Java中关于Integer的使用
后端
Raven100862 小时前
DataWhale共学-向量数据库task01
后端
expect7g2 小时前
Flink KeySelector
大数据·后端·flink
进阶的鱼2 小时前
(4种场景)单行、多行文本超出省略号隐藏
前端·css·面试
知了一笑2 小时前
独立做产品,做一个,还是做多个找爆款?
前端·后端·产品
码事漫谈2 小时前
深入剖析C++内存模型:超越原子性的多线程编程基石
后端
uhakadotcom2 小时前
在python中,使用conda,使用poetry,使用uv,使用pip,四种从效果和好处的角度看,有哪些区别?
前端·javascript·面试