写点什么

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

作者:poemyang
  • 2025-09-18
    北京
  • 本文字数:1540 字

    阅读完需:约 5 分钟

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


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


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



未完待续


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

发布于: 刚刚阅读数: 3
用户头像

poemyang

关注

让世界知道我的存在 2018-03-05 加入

技术/人文, 互联网

评论

发布
暂无评论
技术圈的“绯闻女孩”:Gossip是如何把八卦秘密传遍全网的?_分布式_poemyang_InfoQ写作社区