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


1、zmq概述

ZeroMQ是一種基於消息隊列的多線程網絡庫,其對套接字類型、連接處理、幀、甚至路由的底層細節進行抽象,提供跨越多種傳輸協議的套接字。引用雲風的話來說: ZeroMQ 並不是一個對 socket 的封裝,不能用它去實現已有的網絡協議。它有自己的模式,不同於更底層的點對點通訊模式。它有比 tcp 協議更高一級的協議。(當然 ZeroMQ 不一定基於 TCP 協議,它也可以用於進程間和進程內通訊)它改變了通訊都基於一對一的連接這個假設。 ZeroMQ 把通訊的需求看成四類。其中一類是一對一結對通訊,用來支持傳統的 TCP socket 模型,但並不推薦使用。常用的通訊模式只有三類:
  1. 請求回應模型。由請求端發起請求,並等待回應端回應請求。從請求端來看,一定是一對對收發配對的;反之,在回應端一定是發收對。請求端和回應端都可以是 1:N 的模型。通常把 1 認為是 server ,N 認為是 Client 。ZeroMQ 可以很好的支持路由功能(實現路由功能的組件叫作 Device),把 1:N 擴展為 N:M (只需要加入若干路由節點)。從這個模型看,更底層的端點地址是對上層隱藏的。每個請求都隱含有回應地址,而應用則不關心它。
  2. 發布訂閱模型。這個模型里,發布端是單向只發送數據的,且不關心是否把全部的信息都發送給訂閱端。如果發布端開始發布信息的時候,訂閱端尚未連接上來,這些信息直接丟棄。不過一旦訂閱端連接上來,中間會保證沒有信息丟失。同樣,訂閱端則只負責接收,而不能反饋。如果發布端和訂閱端需要交互(比如要確認訂閱者是否已經連接上),則使用額外的 socket 采用請求回應模型滿足這個需求。
  3. 管道模型。這個模型里,管道是單向的,從 PUSH 端單向的向 PULL 端單向的推送數據流。

更多關於zeromq的解釋,以及zeromq的功能請參考下面幾個鏈接

ØMQ(ZeroMQ)簡介 ,ØMQ - The Guide ,ZeroMQ 的模式

2、zmq架構

2.1、zmq整體架構

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數據。

2.2zmq內部架構

zmq的內部架構涉及到zmq全局變量的管理,並發模型,線程模型(主線程,i/o線程,回收線程,zmq_socket線程,存活於線程中的對象),對象回收模型(對象樹),消息的組織等,要想比較順手的讀懂源碼,還是需要先了解一下這些結構,在zmq的官方站點已經給出來了詳細的講解,也有前輩進行了翻譯:

Internal Architecture of libzmqZeroMQ的內部架構

http://www.aosabook.org/en/zeromq.html<摘錄>開源軟件架構-ZeroMQ

3、zmq基本流程

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

4、zmq對象交互

序列圖有助於理解對象狀態變遷,下圖描述的是客戶端的對象狀態變遷。zmq_socket以ZMQ_REQ模式實例化,用以進行tcp通信:

void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");

4、zmq類層次

①、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的內部架構

http://www.aosabook.org/en/zeromq.html

<摘錄>開源軟件架構-ZeroMQ

libzmq master


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM