Gossip protocol 也叫 Epidemic Protocol (流行病协议),实际上它还有不少别名,好比:“流言算法”、“疫情传播算法”等。算法
这个协议的做用就像其名字表示的意思同样,很是容易理解,它的方式其实在咱们平常生活中也很常见,好比电脑病毒的传播,森林大火,细胞扩散等等。数据库
Gossip protocol 最先是在 1987 年发表在 ACM 上的论文 《Epidemic Algorithms for Replicated Database Maintenance》中被提出。主要用在分布式数据库系统中各个副本节点同步数据之用,这种场景的一个最大特色就是组成的网络的节点都是对等节点,是非结构化网络,这区别与以前介绍的用于结构化网络中的 DHT 算法 Kadmelia。网络
咱们知道,不少知名的 P2P 网络或区块链项目,好比 IPFS,Ethereum 等,都使用了 Kadmelia 算法,而大名鼎鼎的 Bitcoin 则是使用了 Gossip 协议来传播交易和区块信息。分布式
实际上,只要仔细分析一下场景就知道,Ethereum 使用 DHT 算法并非很合理,由于它使用节点保存整个链数据,不像 IPFS 那样分片保存数据,所以 Ethereum 真正适合的协议应该像 Bitcoin 那样,是 Gossip 协议。ide
这里先简单介绍一下 Gossip 协议的执行过程:区块链
Gossip 过程是由种子节点发起,当一个种子节点有状态须要更新到网络中的其余节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中全部的节点都收到了消息。这个过程可能须要必定的时间,因为不能保证某个时刻全部节点都收到消息,可是理论上最终全部节点都会收到消息,所以它是一个最终一致性协议。spa
下面,咱们经过一个具体的实例来体会一下 Gossip 传播的完整过程ip
为了表述清楚,咱们先作一些前提设定:rem
(1)Gossip 是周期性的散播消息,把周期限定为 1 秒
(2)被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3 个节点散播。
(3)每次散播消息都选择还没有发送过的节点进行散播
(4)收到消息的节点再也不往发送节点散播,好比 A -> B,那么 B 进行散播的时候,再也不发给 A。同步
这里一共有 16 个节点,节点 1 为初始被感染节点,经过 Gossip 过程,最终全部节点都被感染:
下面来总结一下
1)扩展性
网络能够容许节点的任意增长和减小,新增长的节点的状态最终会与其余节点一致。
2)容错
网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具备自然的分布式系统容错特性。
3)去中心化
Gossip 协议不要求任何中心节点,全部节点均可以是对等的,任何一个节点无需知道整个网络情况,只要网络是连通的,任意一个节点就能够把消息散播到全网。
4)一致性收敛
Gossip 协议中的消息会以一传10、十传百同样的指数级速度在网络中快速传播,所以系统状态的不一致能够在很快的时间内收敛到一致。消息传播速度达到了 logN。
5)简单
Gossip 协议的过程极其简单,实现起来几乎没有太多复杂性。
Márk Jelasity 在它的 《Gossip》一书中对其进行了概括:
分布式网络中,没有一种完美的解决方案,Gossip 协议跟其余协议同样,也有一些不可避免的缺陷,主要是两个:
1)消息的延迟
因为 Gossip 协议中,节点只会随机向少数几个节点发送消息,消息最终是经过多个轮次的散播而到达全网的,所以使用 Gossip 协议会形成不可避免的消息延迟。不适合用在对实时性要求较高的场景下。
2)消息冗余
Gossip 协议规定,节点会按期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,所以就不可避免的存在消息重复发送给同一节点的状况,形成了消息的冗余,同时也增长了收到消息的节点的处理压力。并且,因为是按期发送并且不反馈,所以,即便节点收到了消息,仍是会反复收到重复消息,加剧了消息的冗余。
Gossip 有两种类型:
Anti-Entropy 是 SI model,节点只有两种状态,Suspective 和 Infective,叫作 simple epidemics。
Rumor-Mongering 是 SIR model,节点有三种状态,Suspective,Infective 和 Removed,叫作 complex epidemics。
其实,Anti-Entropy 反熵是一个很奇怪的名词,之因此定义成这样,Jelasity 进行了解释,由于 Entropy 是指混乱程度(disorder),而在这种模式下能够消除不一样节点中数据的 disorder,所以 Anti-Entropy 就是 anti-disorder。换句话说,它能够提升系统中节点之间的 similarity。
在 SI model 下,一个节点会把全部的数据都跟其余节点共享,以便消除节点之间数据的任何不一致,它能够保证最终、彻底的一致。
因为在 SI model 下消息会不断反复的交换,所以消息数量是很是庞大的,无限制的(unbounded),这对一个系统来讲是一个巨大的开销。
可是在 Rumor Mongering (SIR Model) 模型下,消息能够发送得更频繁,由于消息只包含最新 update,体积更小。并且,一个 Rumor 消息在某个时间点以后会被标记为 removed,而且再也不被传播,所以,SIR model 下,系统有必定的几率会不一致。
而因为,SIR Model 下某个时间点以后消息再也不传播,所以消息是有限的,系统开销小。
在 Gossip 协议下,网络中两个节点之间有三种通讯方式:
对于一个节点数为 N 的网络来讲,假设每一个 Gossip 周期,新感染的节点都能再感染至少一个新节点,那么 Gossip 协议退化成一个二叉树查找,通过 LogN 个周期以后,感染全网,时间开销是 O(LogN)。因为每一个周期,每一个节点都会至少发出一次消息,所以,消息复杂度(消息数量 = N * N)是 O(N^2) 。注意,这是 Gossip 理论上最优的收敛速度,可是在实际状况中,最优的收敛速度是很难达到的。
假设某个节点在第 i 个周期被感染的几率为 pi,第 i+1 个周期被感染的几率为 pi+1 ,
1)则 Pull 的方式:
2)Push 方式:
可见,Pull 的收敛速度大于 Push ,而每一个节点在每一个周期被感染的几率都是固定的 p (0<p<1),所以 Gossip 算法是基于 p 的平方收敛,也称为几率收敛,这在众多的一致性算法中是很是独特的。