简介:
ZeroMQ(简称ZMQ)是一个基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。
ZMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。
ZMQ不是单独的服务,而是一个嵌入式库,它封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。
提供进程内、进程间、机器间、广播等四种通信协议。通信协议配置简单,用类似于URL形式的字符串指定即可,格式分别为inproc://
、ipc://
、tcp://
、pgm://
。ZeroMQ会自动根据指定的字符串解析出协议、地址、端口号等信息。如:
zmq_bind(responder, "tcp://*:5555"); // server
zmq_connect(requester, "tcp://localhost:5555"); // clinet
模式:
简单介绍ZeroMQ的常见模式,实际应用中可以多种模式组合使用。
PAIR:
也叫独占对模式。可以参考重头戏!ZeroMQ的独家对模式详解:ZMQ_PAIR
PAIR.pngREQ/REP:
REQ/REP 是最基本的模式。客户端发送数据请求服务器的响应。
REQ_REP.pngRouter/Dealer:
用于扩展REQ/REP
套接字的高级模式。
在多对多的网络中, 掮客起到在网络的两端双方互不认识的情况下,促成双方的交易。超市就是一个典型的掮客。顾客不必和所有的供应商一一打交道,每个供应商也不需要认识所有的顾客来促成交易 —— 整个交易在超市的促成下完成,双方几乎都不知道对方的存在。
多对多的网络中,Router/Dealer 模式很有用。假设我们有 N 个 Reply server,M 个 Request client,若要保证高可用性,正常而言,双方需要一个 M x N 的 full mesh 的网络才能保证任何一个 client 能够和任何一个 server 建立连接。通过在中间加一层 Router/Dealer,M x N 的连接被简化成 M + N。网络的复杂度大大降低。
PUB/SUB:
Pub/Sub 是消息传输非常常见也是非常有用的一种模式,将数据的发布者和订阅者解耦 —— 发布者者只管产生数据,而不必关心谁是订阅者,有多少订阅者。
比如说你要建一个聊天室,每个人都是发布者,也都是订阅者。发布者不必关心订阅者的加入和离开,消息会以 1:N 的方式扩散到每个订阅者。
PUB_SUB.png发布端单向分发数据,且不关心是否把全部信息发送给订阅端。<u>如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。</u>
订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。
订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。
该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。
PUSH/PULL:
也称作管道模式、流水线模式。该模型主要用于多任务并行,提高任务处理效率。
PUSH_PULL.png- 图中工人向上连接到发生器,并且向下连接到接收器。
- 发生器的PUSH套接字将任务均匀地分配给工人。这就是所谓的负载均衡。
- 接收器的PULL套接字均匀地收集来自工人的结果。
资料:
扩展:
nanomsg
: ZeroMQ作者用C语言新写的消息队列库,解决了ZeroMQ存在的一些问题,改善了一些令人诟病的设计。
网友评论