程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> zeromq源碼分析筆記之架構(1),zeromq源碼

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

編輯:C++入門知識

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


1、zmq概述

ZeroMQ是一種基於消息隊列的多線程網絡庫,其對套接字類型、連接處理、幀、甚至路由的底層細節進行抽象,提供跨越多種傳輸協議的套接字。引用雲風的話來說:ZeroMQ 並不是一個對 socket 的封裝,不能用它去實現已有的網絡協議。它有自己的模式,不同於更底層的點對點通訊模式。它有比 tcp 協議更高一級的協議。(當然 ZeroMQ 不一定基於 TCP 協議,它也可以用於進程間和進程內通訊)它改變了通訊都基於一對一的連接這個假設。ZeroMQ 把通訊的需求看成四類。其中一類是一對一結對通訊,用來支持傳統的 TCP socket 模型,但並不推薦使用。常用的通訊模式只有三類:

更多關於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 libzmq,ZeroMQ的內部架構

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

3、zmq基本流程

下面這幅zmq的基本流程圖有助於整體把握zmq的流程,這幅圖是由前輩總結的,來源於ZeroMQ研究與應用分析,我只是搬運工,更詳細的對象交換圖在第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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved