更多關於zeromq的解釋,以及zeromq的功能請參考下面幾個鏈接
Ø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的內部架構
http://www.aosabook.org/en/zeromq.html,<摘錄>開源軟件架構-ZeroMQ
下面這幅zmq的基本流程圖有助於整體把握zmq的流程,這幅圖是由前輩總結的,來源於ZeroMQ研究與應用分析,我只是搬運工,更詳細的對象交換圖在第4節
序列圖有助於理解對象狀態變遷,下圖描述的是客戶端的對象狀態變遷。zmq_socket以ZMQ_REQ模式實例化,用以進行tcp通信:
void *requester = zmq_socket (context, ZMQ_REQ); zmq_connect (requester, "tcp://localhost:5555");
①、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