zeroMQ研究(转)

偶尔一个机会,了解了下zeroMQ消息队列。

1  ZeroMQ概述

ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型、连接处理、帧、甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字。ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间。

2  系统架构

2.1 总体架构

ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞。ZeroMQ会根据用户调用zmq_init函数时传入的接口参数,创建对应数量的I/O Thread。每个I/O Thread都有与之绑定的Poller,Poller采用经典的Reactor模式实现,Poller根据不同操作系统平台使用不同的网络I/O模型(select、poll、epoll、devpoll、kequeue等)。主线程与I/O线程通过Mail Box传递消息来进行通信。Server开始监听或者Client发起连接时,在主线程中创建zmq_connecter或zmq_listener,通过Mail Box发消息的形式将其绑定到I/O线程,I/O线程会把zmq_connecter或zmq_listener添加到Poller中用以侦听读/写事件。Server与Client在第一次通信时,会创建zmq_init来发送identity,用以进行认证。认证结束后,双方会为此次连接创建Session,以后双方就通过Session进行通信。每个Session都会关联到相应的读/写管道, 主线程收发消息只是分别从管道中读/写数据。Session并不实际跟kernel交换I/O数据,而是通过plugin到Session中的Engine来与kernel交换I/O数据。

图1 总体架构

2.2 所处层次

ZeroMQ不是单独的服务或者程序,仅仅是一套组件,其封装了网络通信、消息队列、线程调度等功能,向上层提供简洁的API,应用程序通过加载库文件,调用API函数来实现高性能网络通信。

图2 所处层次

2.3 消息模型

ZeroMQ将消息通信分成4种模型,分别是一对一结对模型(Exclusive-Pair)、请求回应模型(Request-Reply)、发布订阅模型(Publish-Subscribe)、推拉模型(Push-Pull)。这4种模型总结出了通用的网络通信模型,在实际中可以根据应用需要,组合其中的2种或多种模型来形成自己的解决方案。

2.3.1   一对一结对模型

最简单的1:1消息通信模型,可以认为是一个TCP Connection,但是TCP Server只能接受一个连接。数据可以双向流动,这点不同于后面的请求回应模型。

2.3.2   请求回应模型

由请求端发起请求,然后等待回应端应答。一个请求必须对应一个回应,从请求端的角度来看是发-收配对,从回应端的角度是收-发对。跟一对一结对模型的区别在于请求端可以是1~N个。该模型主要用于远程调用及任务分配等。Echo服务就是这种经典模型的应用。

图3 请求回应模型

2.3.3   发布订阅模型

发布端单向分发数据,且不关心是否把全部信息发送给订阅端。如果发布端开始发布信息时,订阅端尚未连接上来,则这些信息会被直接丢弃。订阅端未连接导致信息丢失的问题,可以通过与请求回应模型组合来解决。订阅端只负责接收,而不能反馈,且在订阅端消费速度慢于发布端的情况下,会在订阅端堆积数据。该模型主要用于数据分发。天气预报、微博明星粉丝可以应用这种经典模型。

图4 发布订阅模型

2.3.4   推拉模型

Server端作为Push端,而Client端作为Pull端,如果有多个Client端同时连接到Server端,则Server端会在内部做一个负载均衡,采用平均分配的算法,将所有消息均衡发布到Client端上。与发布订阅模型相比,推拉模型在没有消费者的情况下,发布的消息不会被消耗掉;在消费者能力不够的情况下,能够提供多消费者并行消费解决方案。该模型主要用于多任务并行。

图5 推拉模型

2.4 通信协议

提供进程内、进程间、机器间、广播等四种通信协议。通信协议配置简单,用类似于URL形式的字符串指定即可,格式分别为inproc://、ipc://、tcp://、pgm://。ZeroMQ会自动根据指定的字符串解析出协议、地址、端口号等信息。

3  工作流程

图6 基本流程

4  性能分析

目前,市面上类似的产品不少,主要有4种:MSMQ(微软产品)、ActiveMQ(Java)、RabbitMQ(Erlang)、ZeroMQ(C++)。除ZeroMQ外,其它3款产品都是一个单独服务或者进程,需要单独安装和运行,且对环境有一定依赖。其中,MSMQ在非Windows平台下安装非常复杂,ActiveMQ需要目标机器上已经安装了Java,RabbitMQ需要Erlang环境。而ZeroMQ是以库的形式存在,由应用程序加载、运行即可。但是ZeroMQ仅提供非持久性的消息队列。

图7是来自于Internet的性能测试数据。显示的是每秒钟发送和接受的消息数。整个过程共产生1百万条1K的消息,测试环境为Windows Vista。从测试数据可以看出,ZeroMQ的性能远远高于其它3个MQ。

但是测试数据仅供参考,因为缺少必须的环境参数和性能指标,比如:CPU参数、内存参数、消息模型、通信协议、极限时消耗CPU百分比、极限时消耗内存百分比等。

图7 性能测试

5  应用场景

应用ZeroMQ的Push-Pull模型实现联众游戏服务器的“热插拔”、负载均衡和消息派发。按照如图8部署服务器,Push端充当Gateway,作为一组游戏服务器集群最上层的一个Proxy,起负载均衡的作用,所有Gameserver作为Pull端。当一个请求到达Push端(Gateway)时,Push端根据一定的分配策略将任务派发到Pull端(Gameserver)。以联众某款游戏A为例,游戏A刚上线时,预计最大同时在线人数是10W,单台Gameserver并发处理能力为1W,需要10台Gameserver,由于游戏A可玩性非常好,半个月后最大同时在线人数暴增到50W,那么不需要在某天的凌晨将Gateway和Gameserver停机,只需要随时在机房新添加40台Gameserver,启动并连接到Gateway即可。

ZeroMQ中对Client和Server的启动顺序没有要求,Gameserver之间如果需要通信的话,Gameserver的应用层不需要管理这些细节,ZeroMQ已经做了重连处理。

图8 应用场景

6  总结

6.1 简单

1、仅仅提供24个API接口,风格类似于BSD Socket。

2、处理了网络异常,包括连接异常中断、重连等。

3、改变TCP基于字节流收发数据的方式,处理了粘包、半包等问题,以msg为单位收发数据,结合Protocol Buffers,可以对应用层彻底屏蔽网络通信层。

4、对大数据通过SENDMORE/RECVMORE提供分包收发机制。

5、通过线程间数据流动来保证同一时刻任何数据都只会被一个线程持有,以此实现多线程的“去锁化”。

6、通过高水位HWM来控制流量,用交换SWAP来转储内存数据,弥补HWM丢失数据的缺陷。

7、服务器端和客户端的启动没有先后顺序。

6.2 灵活

1、支持多种通信协议,可以灵活地适应多种通信环境,包括进程内、进程间、机器间、广播。

2、支持多种消息模型,消息模型之间可以相互组合,形成特定的解决方案。

6.3 跨平台

支持Linux、Windows、OS X等。

6.4 多语言

可以绑定C、C++、Java、.NET、Python、erlang等30多种开发语言。

6.5 高性能

相对同类产品,性能卓越。

转自:http://blog.chinaunix.net/uid-22312037-id-3556937.html

其开源项目:https://github.com/gar1t/erlang-czmq

时间: 2024-10-06 02:29:42

zeroMQ研究(转)的相关文章

ZeroMQ研究与应用分析

转自: http://www.cnblogs.com/rainbowzc/p/3357594.html  1 ZeroMQ概述 ZeroMQ是一种基于消息队列的多线程网络库,其对套接字类型.连接处理.帧.甚至路由的底层细节进行抽象,提供跨越多种传输协议的套接字.ZeroMQ是网络通信中新的一层,介于应用层和传输层之间(按照TCP/IP划分),其是一个可伸缩层,可并行运行,分散在分布式系统间. 2 系统架构 2.1总体架构 ZeroMQ几乎所有的I/O操作都是异步的,主线程不会被阻塞.ZeroMQ

DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了

[概述] 自从上次发布了[DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端]文章后,得到了很多朋友的支持和肯定.这加大了我的开发动力,经过几个晚上的熬夜,终于在昨天晚上,DEMO基本成型,今天再加入了QWorkers来做逻辑处理进程,进一步使得逻辑处理进程更加方便和高效.今天特意写篇blog来记录我的心得与大家分享. [功能实现说明] 沿用上次的草图 目前DEMO图上的功能都已经实现.下面谈谈各部分的实现. 通信服务, 由DIOCP实现,担当与客户端的通信工作

ZeroMQ的学习和研究

ZeroMQ?(也拼写作 ?MQ. 0MQ 或 ZMQ) 是个非常轻量级的开源消息队列软件.它没有独立的服务器,消息直接从一个应用程序被发送到另一个应用程序.ZeroMQ?的学习和应用也非常简单,它只有一个 C++ 编写成的单个库文件?libzmq.dll, 可以链接到任何应用程序中.如果要在?.NET?环境中使用,我们需要用到一个?C#?编写的名为 clrzmq.dll 包装库. ZeroMQ?可以在 Windows. OS X 和 Linux 等多种操作系统上运行, C. C++.?C#.

死亡的协议--- Pieter Hintjens (ZeroMQ作者)

过去几年中用zeromq写过几个系统系统.对ZeroMQ强大和灵活印象非常深刻.在阅读zeromq guide文档时候.发现作者整理各种通信模式非常经典和实用,可以作为分布式通信的教科书来看.第一次见到这么有价值的开源框架说明文档 .  Pieter Hintjens   2010诊断出胆管癌,并成功手术切除.最近 (2016年4月)发现癌症大面积扩散到肺部,已经无法治疗. 他写的最后一篇通信模式是关于死亡协议. 原文地址是 A Protocol for Dying http://hintjen

ZeroMq LRU算法中间件

前一段时间2014北京PyCon大会吐槽颇多,所以我就到InfoQ上找了找2013的大会视频,对网络射击手游High Noon 2基于Python的服务器架构的视频挺感兴趣,尤其是游戏服务器中的0 downtime,原理他们底层不是原生的socket, 而是基于ZeroMq的socket,由于ZeroMq的短线自动重连可以满足游戏服务器的热启动,不需要代码层面的热启动,热更新,当更新代码完成后直接重启服务器,之前未处理的请求会继续处理.瞬间觉得非常高大上,于是最近一段时间回家一直研究ZeroMq

高性能的通讯库-zeroMQ的几个高性能特征

这两天研究了一下zeroMQ,号称史上最好的通讯库,比rabbitMQ快很多,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ. zeroMQ在使用模式上支持多种,有req-reply,publish-subscribe,pipe. 下图是zeroMQ的架构图 简单说明一下, 从上到下依次是网络.zeroMQ.用户的应用,相当于在应用层和网络层加了一个消息通信库这么一个层次 应用层通过API使用socket(此socket不同于传统意义上的socket)和zeroMQ

ZeroMQ:云计算时代最好的通讯库

还在学socket编程吗?还在研究为什么epoll比select更好吗? 噢,不必了! 在复杂的云计算环境中,我们面临的难题远比这个复杂得多. 庞大的服务器集群作为计算云,对来来看或许只是一个简单的搜索框:而在云的内部,复杂的互联和海量的通讯,加之不稳定的网络环境,廉价服务器的低可用性——构建一个高可用性且具备伸缩能力的云计算的环境,不是那么容易的! 为什么说ZeroMQ是云计算时代最好的通讯库呢?我们从ZeroMQ的特性来分析吧: 1.The socket library that acts

ZeroMQ使用汇总

ZeroMQ,史上最快的消息队列 -– ZMQ的学习和研究 ZeroMQ 的模式 [架构] ZeroMQ 深度探索(一)  消息队列ZeroMQ 服务端使用流程: void* m_Context; void* m_sktMsgVideoFrame; m_sktMsgVideoFrame = zmq_socket(m_Context,ZMQ_PUB); int ret = zmq_bind(m_sktMsgVideoFrame,bytesMsgVideoFrameAddress.data());

<摘录>开源软件架构-ZeroMQ

原文链接:http://www.aosabook.org/en/zeromq.html ØMQ是一个消息通信系统,如果你愿意的话也可以称其为“面向消息的中间件”.ØMQ的应用环境很广泛,包括金融服务.游戏开发.嵌入式系统.学术研究以及航空航天等领域. 消息通信系统完成的工作基本上可看作为负责应用程序之间的即时消息通信.一个应用程序决定发送一个事件给另一个应用程序(或者多个应用程序),它将需要发送的数据组合起来,点击“发送”按钮就行了——消息通信系统会搞定剩下的工作. 不同于即时消息通信的是,消息