與消息發送通道對應,發送的消息需要一個接收端接收消息,它就是ChannelReceiver。接收端負責接收處理其他節點從消息發送通道發送過來的消息,實際情況如圖每個節點都有一個ChannelSender和ChannelReceiver,ChannelSender向其他節點的ChannelReceiver發送消息。本質是每個節點暴露一個端口作為服務端監聽客戶端,而每個節點又充當客戶端連接其他節點的服務端,所以ChannelSender就是充當客戶端的集合,ChannelReceiver充當服務端。
?
????集群消息復制過程中,每個節點ChannelReceiver負責接收來自其他節點的消息,假設一個n節點的集群,一般情況下每個ChannelReceiver對應n-1個連接,因為集群之間的通信連接都是長連接,長連接有助于提高通信效率,如下圖,4個節點的集群,node1的ChannelReceiver的客戶端連接數為3,分別是node2、node3、node4三個節點作為客戶端發起的socket連接。這三個節點產生的數據會通過此通道同步到node1節點,同樣地,node2的ChannelReceiver擁有node1、node3、node4的客戶端連接,這三個節點產生的數據也會同步到node2節點。Node3、node4也擁有三個客戶端連接。為提高處理效率,此處還是使用NIO處理模型。
?
????除此之外,再接收操作中為了優化性能采取了很多措施,例如引入任務池,即是把接收任務提前定義好放入內存中,接收時可直接獲取使用而不用再實例化;例如一次獲取若干個報文進行處理,即使用nio模式讀取消息到緩沖區后直接處理整個緩沖區的消息,它可能包含若干個報文;網絡IO需要優化的地方及手段都比較多,tribes確實已經做了很多優化方面的工作。
喜歡java的同學可以交個朋友:
