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

相关文章
相关标签/搜索