ZeroMQ源码分析笔记之架构

一、概述


ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象。提供跨越多种传输协议的套接字。

引用云风的话来说:ZeroMQ并不是对一个socket的封装,不能用它去实现已有的网络协议。它不同于更底层的点对点通讯模式,它有自己的模式。有比tcp更高一级的协议。

ZeroMQ并不一定基于tcp协议,也可以用于进程间和进程内通讯。它改变了通讯都基于一对一的连接的假设。


ZeroMQ支持4种通讯模型

1)一对一结对通讯
用于支持传统的TCP Socket模型,但并不推荐使用。


2)请求回应模型
由请求端发起请求,并等待回应端回应请求。
从请求端来看,一定是一对对收发配对的;反之,在回应端一定是发收对。
请求端和回应端都可以是 1:N 的模型。通常把 1 认为是 server ,N 认为是 Client 。
ZeroMQ 可以很好的支持路由功能(实现路由功能的组件叫作Device),把 1:N 扩展为 N:M (只需要加入若干路由节点)。
从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含有回应地址,而应用则不关心它。


3)发布订阅模型
发布端是单向只发送数据的,且不关心是否把全部的信息都发送给订阅端。
如果发布端开始发布信息的时候,订阅端尚未连接上来,这些信息直接丢弃。不过一旦订阅端连接上来,中间会保证没有信息丢失。同样,订阅端则只负责接收,而不能反馈。如果发布端和订阅端需要交互(比如要确认订阅者是否已经连接上),则使用额外的 socket 采用请求回应模型满足这个需求。


4)管道模型
管道是单向的,从 PUSH 端单向的向 PULL 端单向的推送数据流。

以上2)~4)模型的使用,可以参考:消息队列和ZeroMQ原理和应用

二、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数据。

三、ZQM实现基本流程


借用前辈在 “ZeroMQ研究与应用分析” 总结的流程图,可以有助于我们把握ZMQ整体流程。

需要提醒的是,新版ZMQ已经不建议使用 zmq_init 初始化上下文语境,而是使用 zmq_new 来创建上下文。

在这里插入图片描述

四、ZQM对象交互


序列图有助于理解对象状态变迁,下图描述的是客户端的对象状态变迁。zmq_socket以ZMQ_REQ模式实例化,用以进行tcp通信:

<span style="color:#333333"><span style="background-color:#f9f5e9"><code class="language-cpp">void *requester = zmq_socket (context, ZMQ_REQ);
zmq_connect (requester, "tcp://localhost:5555");
</code></span></span>
  • 1
  • 2

在这里插入图片描述

五、ZQM类关系层次


在这里插入图片描述

说明:

  • 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的对象树结点,或者说多叉树的结点,其主要用于对象的销毁,可以想到,对象的销毁就是这棵树的销毁过程,必须要使用深度优先的算法来销毁。
  • 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中,被当成⼀种特殊的”线程“,具有收发命令的功能。

(493条消息) ZeroMQ源码分析笔记之架构_夏之七的博客-CSDN博客_zeromq源码分析

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值