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