zeromq原始碼分析筆記之架構(1)

2021-09-26 21:08:57 字數 3202 閱讀 9208

zeromq是一種基於訊息佇列的多執行緒網路庫,其對套接字型別、連線處理、幀、甚至路由的底層細節進行抽象,提供跨越多種傳輸協議的套接字。引用雲風的話來說:

請求回應模型。由請求端發起請求,並等待回應端回應請求。從請求端來看,一定是一對對收發配對的;反之,在回應端一定是發收對。請求端和回應端都可以是 1:n 的模型。通常把 1 認為是 server ,n 認為是 client 。zeromq 可以很好的支援路由功能(實現路由功能的元件叫作 device),把 1:n 擴充套件為 n:m (只需要加入若干路由節點)。從這個模型看,更底層的端點位址是對上層隱藏的。每個請求都隱含有回應位址,而應用則不關心它。

發布訂閱模型。這個模型裡,發布端是單向只傳送資料的,且不關心是否把全部的資訊都傳送給訂閱端。如果發布端開始發布資訊的時候,訂閱端尚未連線上來,這些資訊直接丟棄。不過一旦訂閱端連線上來,中間會保證沒有資訊丟失。同樣,訂閱端則只負責接收,而不能反饋。如果發布端和訂閱端需要互動(比如要確認訂閱者是否已經連線上),則使用額外的 socket 採用請求回應模型滿足這個需求。

管道模型。這個模型裡,管道是單向的,從 push 端單向的向 pull 端單向的推送資料流。

ømq(zeromq)簡介 ,ømq - the guide ,zeromq 的模式

zeromq幾乎所有i/o操作都是非同步的,每個zmq i/o 執行緒(與實際執行緒不同)都有與之繫結的poller,poller採用經典的reactor模式實現,poller根據不同作業系統平台使用不同的網路i/o模型(select、poll、epoll、devpoll、kequeue等)。在zeromq中,zmq_socket也被看成是乙個zmq io執行緒。每個執行緒內含乙個信箱,用於執行緒與執行緒間傳遞命令(後面會詳細講),在建立zmq io執行緒時,會把信箱控制代碼加到poller中,用於監聽是否有命令到達。當client端開始發起連線或者server端開始監聽時,會在主線程建立zmq_connector或者zmq_listener,主線程使用zmq_socket的mailbox傳送命令給io執行緒,將其繫結到io執行緒中,io執行緒會把zmq_connector或者zmq_listener含有的控制代碼加入poller中,以偵聽讀寫事件。client端與server端都是通過session來管理連線和通訊,乙個session代表一次會話,每個session都會關聯到相應的讀/寫管道, 主線程收發訊息只是分別從管道中讀/寫資料。session並不實際跟kernel交換i/o資料,而是通過plugin到session中的engine來與kernel交換i/o資料。

zmq的內部架構涉及到zmq全域性變數的管理,併發模型,執行緒模型(主線程,i/o執行緒,**執行緒,zmq_socket執行緒,存活於執行緒中的物件),物件**模型(物件樹),訊息的組織等,要想比較順手的讀懂原始碼,還是需要先了解一下這些結構,在zmq的官方站點已經給出來了詳細的講解,也有前輩進行了翻譯:

internal architecture of libzmq,zeromq的內部架構

摘錄》開源軟體架構-zeromq

下面這幅zmq的基本流程圖有助於整體把握zmq的流程,這幅圖是由前輩總結的,**於zeromq研究與應用分析,(不知道是否是原創,有很多一樣的博文,分不清原創是誰),不過新版的zmq已經不建議使用zmq_init初始化上下文語境了,新版建議使用zmq_new來建立上下文,關於新版zmq的乙個詳細流程在第4節會給出。

序列圖有助於理解物件狀態變遷,下圖描述的是客戶端的物件狀態變遷。zmq_socket以zmq_req模式例項化,用以進行tcp通訊:

①、object_t,主要用於傳送命令和處理命令,所有繼承object_t的子類都具備該類的功能

②、io_thread_t,內含乙個poller,可監聽控制代碼的讀、寫、異常狀態,繼承自object_t,具有接收命令、處理命令、傳送命令的功能

③、io_object_t,可以獲取乙個io_thread_t的poller,從而具備poller功能,所有繼承自該類的子類都具有pollere功能,可監聽控制代碼的讀、寫、異常狀態

④、reaper_t,zmq的**執行緒

⑤、own_t,zmq的物件樹結點,或者說多叉樹的結點,其主要用於物件的銷毀,可以想到,物件的銷毀就是這棵樹的銷毀過程,必須要使用深度優先的演算法來銷毀。關於zmq物件樹在internal architecture of libzmq有詳細講解

⑥、tcp_connector_t,zmq_socket的聯結器,使用她來建立tcp連線

⑦、tcp_listener_t,zmq_socket的***

⑧、stream_engine,負責處理io事件中的一種----網路事件,把網路位元組流轉換成zeromq的msg_t訊息傳遞給session_base_t。另外一些和版本相容相關的雜務也stream_engine處理的。stream_engine_t處理完雜務,到session_base_t就只看見msg_t了。

⑨、session_base_t,管理zmq_socket的連線和通訊,主要與engine進行交換

⑩、socket_base_t,zeromq的socket,在zmq中,被當成一種特殊的」執行緒「,具有收發命令的功能

參考資料

ømq(zeromq)簡介

ømq - the guide

zeromq 的模式

internal architecture of libzmq

zeromq的內部架構

《摘錄》開源軟體架構-zeromq

libzmq master

分類:

zeromq原始碼學習筆記,

網路程式設計,

多執行緒程式設計

標籤:

網路程式設計,

zeromq,

多執行緒程式設計

zeromq原始碼分析筆記之準備(0)

zeromq這個庫主要用於程序通訊,包括本地程序 網路通訊,涉及到一些基礎知識,主要包括管道通訊,socket程式設計的內容,反應器模式 使用io多路復用實現 無鎖佇列這幾塊比較重要的部分,下面的幾個鏈結是這幾塊內容的學習筆記,有了這些知識,能比較好的理解這個開源庫 1 socket原理詳解 2 i...

zeroMQ原始碼分析之網路機制和效能

tcp協議是流式傳輸協議,會出現粘包和半包的問題。解決方案 1.在傳輸資料的時候加入特殊的字元,如http協議 2.採用tlv格式,type,length,value,如二進位制協議 zeromq的msg t結構 1.短訊息使用記憶體copy比malloc比較高階 2.長訊息使用記憶體malloc比...

zeromq原始碼學習 ctx建立

ctx t封裝了與zeromq庫相關的全部全域性狀態。當使用zeromq時,需要呼叫zmq ctx new函式建立乙個ctx t物件,並返回該物件,沒有對context物件進行初始化。其中乙個重要的變數starting,它為true時,表示context建立,但是未建立任何乙個socket物件。當建...