通過gossip協議廣播的訊息種類較多,不同種類的訊息有不同的處理邏輯。gossip模組利用go語言的通道,實現乙個訊息的多路分用介面channeldemultiplexer:
type channeldemultiplexer struct其中lock是乙個讀寫鎖,用來同步對channels的處理;closed是通道是否關閉的標識,通道關閉就不能再從通道中讀取資料;channels是乙個channel陣列,如下所示:
type channel struct}ch是快取訊息的通道,預設只能儲存10個訊息。節點接收到gossip訊息的時候,會呼叫 demultiplex介面。pred用來判斷訂閱者對某個訊息是否感興趣,感興趣的訊息會過濾出來存放在ch裡,等待下一步的處理。pre的策略可以根 據業務邏輯來實現,函式定義如下:
type messageacceptor func(inte***ce{}) bool我們來看看gossip模組實現的幾種messageacceptor。
1)gossip訊息過濾器。gossip模組接收到的訊息型別有:gossipmessage和signed gossipmessage,如果不是這兩種型別的訊息,會過濾出來丟棄。¤
2)存活訊息過濾器。過濾出型別為gossipmessage_alivemsg、gossipmessage_memreq和gossipmessage_memres的訊息。
3)狀態訊息過濾器。過濾出狀態同步訊息。
4)遠端狀態訊息過濾器。過濾出gossipmessage_staterequest和 gossipmessage_stateresponse的訊息,這兩種訊息是為了狀態同步而主動傳送和接收的訊息。如果它包含了連線驗證資訊,則會呼叫 mcs驗證是否是指定通道成員傳送的訊息。
5)主節點擊舉訊息過濾器。過濾出某個通道上的gossipmessage_leadershipmsg訊息。
我們來看看gossip模組中的多路分用訊息過濾器漏斗,如圖4-2所示。
節點的gossip模組會繫結grpc埠(預設是7051埠),從其他節點或者排序服務節點上獲取到的訊息, 通過handler呼叫demultiplex實現訊息的多路分用,訊息會通過訊息過濾器過濾後進行業務邏輯的處理。這裡的過濾器都虛線來表示,以說明同 一層的過濾器不是互斥的,就是說同一層的過濾器輸入都是相同的,經過過濾器的輸出會不同。如果經過多層過濾器的過濾,訊息是在上一層過濾的基礎上篩選出來 的。比如「狀態資料過濾器」和「狀態同步訊息過濾器」的輸入都是「狀態訊息過濾器」的輸出,而「狀態訊息過濾器」的輸入是grpc訊息過濾出的 gossip訊息。
圖4-2 多路分用訊息過濾器漏斗
channeldemultiplexer中的channels可以定義多個,同乙個訊息只要滿足pre定義的過 濾條件,就會放到對應的ch裡,所以可能不同的channel裡有相同的訊息。對於需要廣播的訊息,gossip模組還實現了訊息分割槽,同乙個訊息經過過 濾器過濾以後,只會出現在乙個列表中。函式實現比較簡單,**如下:
經過partitionmessages處理過的訊息a,會分成兩個切片,滿足過濾器pre的放到切片s1中,不滿足的放到切片s2中。廣播訊息過濾器有以下幾種:
·區塊資料過濾器:過濾出指定通道chainid的區塊資料。
·狀態訊息過濾器:過濾出狀態同步訊息。
·通道內部的訊息過濾器:過濾出只在通道內部廣播的訊息。
·組織內部的訊息過濾器:過濾出只在組織內部廣播的訊息。
·主節點擊舉訊息過濾器:過濾出某個通道上的gossipmessage_leadershipmsg訊息。
圖4-3所示為分割槽訊息過濾器漏斗。
圖4-3 分割槽訊息過濾器漏斗
和訊息多路分用不同,經過分割槽以後訊息只能在乙個結果集中,同一層的過濾器是互斥的。比如經過「區塊資料過濾器」過濾以後,「狀態訊息過濾器」等就只能在其他訊息中進行篩選。
'); (window.slotbydup = window.slotbydup || ).push(); })();
'); (window.slotbydup = window.slotbydup || ).push(); })();
通訊三要素,傳送訊息及多路復用
3.通道 包括提供訊息傳遞途徑的介質,在通道上訊息能夠從源傳到目的地。計算機網路傳遞的訊息可大可小,為了解決裝置重要資訊需要小的頻寬而有可能被不重要資訊需要大的頻寬而被占用,而推出了解決方法,這個解決方法是分段處理,訊息被 分割成小片段,以便能夠更輕易地通過介質一同傳送。分段訊息有兩個主要的優點 1...
4 1 0 棧的順序儲存結構及實現
順序棧結構 typedef struct sqstack 棧普通情況 空棧和棧滿的情況示意圖 邏輯圖 插入元素e為新的棧頂元素 status push sqstack s,selemtype e 若棧不空,則刪除s的棧頂元素,用e返回其值,並返回ok 否則返回error status pop sqs...
kafka 訊息的分割槽分配策略
訊息的消費原理 觸發分割槽分配策略的條件 topic 在kafka 中,topic是乙個儲存訊息的邏輯概念,可以認為是乙個訊息的集合。每條訊息傳送到 kafka 集群的訊息都有乙個類別。每個topic可以有多個生產者向他傳送訊息,也可以有多個消費者去消費訊息 partition 每個topic 可以...