這兩天研究了一下zeroMQ,號稱史上最好的通信庫,比rabbitMQ快不少,基於c語言開發的,實時流處理sorm的task之間的通訊就是用的zeroMQ。算法
zeroMQ在使用模式上支持多種,有req-reply,publish-subscribe,pipe。網絡
下圖是zeroMQ的架構圖session
簡單說明一下,多線程
從上到下依次是網絡、zeroMQ、用戶的應用,至關於在應用層和網絡層加了一個消息通訊庫這麼一個層次架構
應用層經過API使用socket(此socket不一樣於傳統意義上的socket)和zeroMQ進行交互併發
zeroMQ有多個工做者線程,每一個工做者線程能夠建立多個socket鏈接對象(由listener監聽),也能夠做爲socket客戶端鏈接遠程的對象。異步
socket套接字對象包括engine、session對象;engine負責鏈接的管理(和網絡進行交互,好比從網絡中讀取數據,消息排隊,接受新的鏈接等);session對象主要負責和zeroMQ的socket進行交互,他們之間採用異步事件驅動的無鎖隊列pipe。socket
zeroMQ在設計上主要採用瞭如下幾個高性能的特徵:性能
一、無鎖的隊列模型優化
對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列算法CAS;在pipe的兩端註冊有異步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。
二、批量處理的算法
對於傳統的消息處理,每一個消息在發送和接收的時候,都須要系統的調用,這樣對於大量的消息,系統的開銷比較大,zeroMQ對於批量的消息,進行了適應性的優化,能夠批量的接收和發送消息。
三、多核下的線程綁定,無須CPU切換
區別於傳統的多線程併發模式,信號量或者臨界區, zeroMQ充分利用多核的優點,每一個核綁定運行一個工做者線程,避免多線程之間的CPU切換開銷。