Gossip 流言蜚語、小道消息之意。Gossip 協議也叫 Epidemic 協議(流行病協議)。類似現實生活中的緋聞傳播、或者流行病傳播,最終達到全網同步的狀態。
    原本用于分布式數據庫中節點同步數據使用,后被廣泛用于數據庫復制、信息擴散、集群成員身份確認、故障探測等。
    在區塊鏈中用來確保網絡中所有的節點數據一樣,解決狀態在集群中的傳播和保證狀態一致性問題。最初是由施樂公司帕洛阿爾托研究中心(Palo Alto Research Center)的研究員艾倫·德默斯(Alan Demers)于1987年創造的。
Gossip 協議的優勢:
一、可擴展性
    一般需要O(logN)輪消息傳播即可達到狀態一致性,其中N代表節點的個數。每個節點只發送固定數量的消息,與網絡中的節點總數無關。消息傳送只負責單向發送,不等待消息的確認。系統可以輕松的擴展到數百萬個進程。
二、容錯性
    網絡中任何節點的重啟、宕機都不會影響整個網絡的運行。具有天然的分布式系統容錯特性。
三、健壯性
    所有網絡中的節點都是對等的,沒有特殊的節點。任何節點出現問題都不會阻止其他節點繼續發送消息。任何節點可以隨時加入與退出。
四、最終一致性
    實現信息指數級的快速傳播。當有新信息需要傳播時,可以快速的發送到全局節點。在有限的時間內做到所有節點都擁有新的數據。
Gossip 協議的缺點:
一、消息延遲
    由于擴展性的需要,節點只向隨機的少數幾個節點發消息,通過多輪的散播來達到全網一致性,這樣不可避免的會造成消息的延遲。
二、消息冗余
    節點定期隨機選擇周圍節點發送消息,而收到消息的節點也會重復該步驟,所以不可避免的引起接收節點多次收到相同的消息,增加消息處理壓力。
Gossip協議靠三種類型的消息進行傳播,來達到最終的狀態一致性。
一、直接郵寄 Direct-Mail
    直接發送更新數據,當數據發送失敗時,將數據緩存在失敗重試隊列,然后重傳。
    這種方式雖然存在丟數據問題,但實現簡單,數據同步及時,不需要校驗數據一致性對比,性能消息低。
二、反熵 Anti-Entropy
    以固定的概率傳播所有的數據。性能消耗高。
    每個節點周期性的隨機選擇其他節點,通過互相交換自己的所有數據來消除兩者之間的差異。
    實現反熵時,一般設計一個閉環的流程,一次修復所有節點的副本數據不致,在一個不確定的時間范圍內實現數據副本的最終一致性。
    反熵使用『Simple epidemics』方式,其包含兩種狀態:Susceptible 和 Infective,這種模型稱為 SI model。
    處于 infective 狀態的節點代表其有數據更新,并且會將這個數據分享給其他節點。
    處于 susceptible 狀態的節點代表其并沒有收到來自其他節點的更新。
三、謠言傳播 Rumor-Mongering
    僅傳播新到達的數據。適用于動態變化的分布式,性能消息相對較低。
    當節點有了新信息后,這個節點就變成了『活躍』狀態,它將周期性地向其他節點傳播新信息,直到所有的節點都知道該新消息。
    謠言傳播使用『Complex epidemics』方法,比反熵多一種 removed 狀態,這種模型也稱為 SIR model。
    處于removed狀態的節點,表示已經接收到來自其他節點的更新,但是其并不會將這個更新分享給其他節點。
    因為謠言消息會在某個時間標記為removed,然后不會再被傳播給其他節點,所以謠言傳播有極小概率使得所有節點數據不一致。
Gossip 算法實現
    在實現算法中,主要有Push、Pull 和 PushAndPull 三種方式。
    Push 方式:將自己的所有副本數據,推給對方,修復對方副本中的熵。
    Pull 方式:拉取對方所有的副本數據,修復自己副本中的熵。
    PushAndPull 方式:同時修復自己副本和對方副本中的熵。
反熵 Anti-Entropy SI 模型算法偽代碼:

謠言傳播 Rumor-Mongering SIR 模型算法偽代碼:
