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 的平方收斂,也稱爲機率收斂,這在衆多的一致性算法中是很是獨特的。