zeromq源碼分析筆記之架構(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的功能請參考下面幾個連接html

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

二、zmq架構

2.一、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數據。github

2.2zmq內部架構

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

Internal Architecture of libzmqZeroMQ的內部架構網絡

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

三、zmq基本流程

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

四、zmq對象交互

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

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

四、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

相關文章
相關標籤/搜索