Gossip 協(xié)議也叫 Epidemic Protocol(流行病協(xié)議)雕崩,主要用于消息傳播仰坦,是一種一致性算法扣孟。協(xié)議也非常好理解,正如協(xié)議的名稱瞬雹,如流行病一樣靠“感染”節(jié)點進行持續(xù)傳播昧谊。使用 Gossip 協(xié)議的有:Redis Cluster、Consul挖炬、Apache Cassandra等揽浙。
六度分隔理論
要說 Gossip 就不得不提“六度分隔理論”状婶,簡單的說:你和任何一個陌生人之間所間隔的人不會超過五個意敛,也就是說,最多通過五個人你就能夠認識任何一個陌生人膛虫。由時任哈佛大學的心理學教授 Stanley Milgram 在1967年提出草姻。
Facebook 研究了已注冊的15.9億使用者資料,在2016年公布標題為 “Three and a half degrees of separation” 的研究結果稍刀。發(fā)現世界比人們想象的更緊密撩独,世界上的每個人(至少在 Facebook 活躍的15.9億人)平均通過3.57個人就可以與任意另外一個人產生聯(lián)系。
基于六度分隔理論账月,信息的傳播會非常迅速综膀,而且網絡交互次數不會很多。Gossip 協(xié)議是基于六度分隔理論的很好實現局齿。
協(xié)議原理
Gossip協(xié)議基本思想就是:一個節(jié)點想要分享一些信息給網絡中的其他的節(jié)點剧劝,于是隨機選擇一些節(jié)點進行信息傳遞。這些收到信息的節(jié)點接下來把這些信息傳遞給其他一些隨機選擇的節(jié)點抓歼。整體過程描述如下讥此。
- Gossip 是周期性的散播消息
- 被感染節(jié)點隨機選擇 k 個鄰接節(jié)點(fan-out)散播消息,假設把 fan-out 設置為2谣妻,每次最多往2個節(jié)點散播
- 每次散播消息都選擇尚未發(fā)送過的節(jié)點進行散播
- 收到消息的節(jié)點不再往發(fā)送節(jié)點散播萄喳,比如 A -> B,那么 B 進行散播的時候蹋半,不再發(fā)給 A
協(xié)議優(yōu)點
擴展性
Gossip 協(xié)議的可擴展性極好他巨,一般只需要 O(LogN) 輪就可以將信息傳播到所有的節(jié)點,其中 N 代表節(jié)點的個數减江。即使集群節(jié)點的數量增加闻蛀,每個節(jié)點的負載也不會增加很多,幾乎是恒定的您市。這就允許集群管理的節(jié)點規(guī)模能橫向擴展到幾千幾萬個觉痛,集群內的消息通信成本卻不會增加很多。
容錯
網絡中任何節(jié)點的宕機和重啟都不會影響 Gossip 消息的傳播茵休,Gossip 協(xié)議具有天然的分布式系統(tǒng)容錯特性薪棒。
健壯性
Gossip 協(xié)議是去中心化的協(xié)議手蝎,所以集群中的所有節(jié)點都是對等的,任何節(jié)點出現問題都不會阻止其他節(jié)點繼續(xù)發(fā)送消息俐芯。任何節(jié)點都可以隨時加入或離開棵介,而不會影響系統(tǒng)的整體服務質量。
最終一致性
消息傳播是指數級的快速傳播吧史,因此當有新信息傳播時邮辽,消息可以快速地發(fā)送到全局節(jié)點。系統(tǒng)狀態(tài)的不一致可以在很快的時間內收斂到一致贸营。
協(xié)議缺點
消息延遲
節(jié)點隨機向少數幾個節(jié)點發(fā)送消息吨述,消息最終是通過多個輪次的傳播而到達全網,不可避免的造成消息延遲钞脂。不適合于對實時性要求較高的場景揣云。
消息冗余
節(jié)點會定期隨機選擇周圍節(jié)點發(fā)送消息,而收到消息的節(jié)點也會重復該步驟冰啃,因此就不可避免的存在消息重復發(fā)送給同一節(jié)點的情況邓夕,造成了消息的冗余,同時也增加了收到消息的節(jié)點的處理壓力阎毅。
拜占庭問題
如果有一個惡意傳播消息的節(jié)點焚刚,Gossip協(xié)議的分布式系統(tǒng)就會出問題。