zeroMQ相关了解

zeroMQ相关知识

巨人们的肩膀:
官方guide:官方guide
官方的Examples 点此get(各种语言的例子,这些例子都是guide里面的列子,需要结合着看,可以看到哪个例子了拷出来自己执行一下)
可能是某团队贡献的有关guide的中文翻译gitbook点此打开

刚开始没有找到上面的那个翻译,自己一点点翻译啃的,后来实在步履维艰,快要失去兴趣了,就在网上找见了那个翻译,很不错的翻译。下面只是记录了点学习过程中的笔记,具体还是看上面的两个东西。

ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It’s fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source.

为什么要使用ZeroMQ

What we need is something that does the job of messaging, but does it in such a simple and cheap way that it can work in any application, with close to zero cost. It should be a library which you just link, without any other dependencies. No additional moving pieces, so no additional risk. It should run on any OS and work with any programming language.And this is ZeroMQ: an efficient, embeddable library that solves most of the problems an application needs to become nicely elastic across a network, without much cost.

  • It handles I/O asynchronously, in background threads. These communicate with application threads using lock-free data structures, so concurrent ZeroMQ applications need no locks, semaphores, or other wait states.(它在后台线程异步处理IO,应用线程之间的交流使用无锁的数据结构,所以不用使用多线程的锁、信号量、和其他等待状态)
  • Components can come and go dynamically and ZeroMQ will automatically reconnect. This means you can start components in any order. You can create “service-oriented architectures” (SOAs) where services can join and leave the network at any time.(组件可以动态来去,zeroMQ将自动重新连接。意味着你可以任意顺序开启一个组件,你可以创建“面向服务架构”,服务可以随时加入和离开)
  • It queues messages automatically when needed. It does this intelligently, pushing messages as close as possible to the receiver before queuing them(它会在需要时对消息自动排队。在排队之前它可以智能的尽可能最近的推送消息给接收器).
  • It has ways of dealing with over-full queues (called “high water mark”). When a queue is full, ZeroMQ automatically blocks senders, or throws away messages, depending on the kind of messaging you are doing (the so-called “pattern”)(它有个高水位线的方式处理过多的队列。当一个队列满了,zeroMQ会自动的阻塞发送端,或者扔掉消息,取决于你正在处理的消息类型).
  • It lets your applications talk to each other over arbitrary transports: TCP, multicast, in-process, inter-process. You don’t need to change your code to use a different transport.(它可以让你的程序通过任意传输相互交谈:TCP、多播、进程内、进程见。你不需要去改变你的代码来使用不同的传输)
  • It handles slow/blocked readers safely, using different strategies that depend on the messaging pattern(它使用依赖不同的消息模式传递模式的不同策略安全的处理 慢速/阻塞的读取者).
  • It lets you route messages using a variety of patterns such as request-reply and pub-sub. These patterns are how you create the topology, the structure of your network.(它允许你使用不同的模式去按照特定路线发送消息(例如request-reply和pub-sub),这些模式时你如何创建拓扑-网络的结构)
  • It lets you create proxies to queue, forward, or capture messages with a single call. Proxies can reduce the interconnection complexity of a network.(它允许你创建代理,以便通过单个调用对消息进行排队、转发或者捕获。代理可以降低网络的交互复杂性)
  • It delivers whole messages exactly as they were sent, using a simple framing on the wire. If you write a 10k message, you will receive a 10k message.(它在wire上用了一个简单的设计可以传送和你发送的一整个完全一样的消息。如果你写了10k消息,你将会收到10k消息)
  • It does not impose any format on messages. They are blobs from zero to gigabytes large. When you want to represent data you choose some other product on top, such as msgpack, Google’s protocol buffers, and others.(它不会在消息上施加任何格式。他们是从0到千兆字节的blobs。当你想要代表数据,你可以选择一些产品在上面,像是msgpack、谷歌的协议缓冲区或者其他产品)
  • It handles network errors intelligently, by retrying automatically in cases where it makes sense.(它通过在有意义的情况下自动重试,智能的处理网络错误)
  • It reduces your carbon footprint. Doing more with less CPU means your boxes use less power, and you can keep your old boxes in use for longer. Al Gore would love ZeroMQ.(它可以减少你的碳脚印。用更少的cpu做更多意味着你的盒子使用更少的电,并且你可以保持你的旧盒子使用更的更久。AI GOre会喜欢ZeroMQ的)

Actually ZeroMQ does rather more than this. It has a subversive effect on how you develop network-capable applications. Superficially, it’s a socket-inspired API on which you do zmq_recv() and zmq_send(). But message processing rapidly becomes the central loop, and your application soon breaks down into a set of message processing tasks. It is elegant and natural. And it scales: each of these tasks maps to a node, and the nodes talk to each other across arbitrary transports. Two nodes in one process (node is a thread), two nodes on one box (node is a process), or two nodes on one network (node is a box)—it’s all the same, with no application code changes.(实际上zeroMQ做的比这个多,它在你如何开发具有网络功能的应用程序有颠覆性的影响。在表面上,它是个由socket触发的API,你做的是zmq_recv() 和zmq_send()。但是消息处理迅速成为central loop,你的应用程序很快分解成一组消息处理任务。它是优雅和自然的。还有他的扩展:每一个任务映射成一个节点,这些节点通过任意传输进行交流。一个进程中的两个节点(节点是线程),一个盒子上的两个节点(节点是进程),或者一个网络上的两个节点(节点是box)-它们是完全一样的,不需要应用程序代码改变)

zeroMQ的整体架构图:

在这里插入图片描述
从上到下依次是网络、zeroMQ、用户的应用,相当于在应用层和网络层加了一个消息通信库这么一个层次
应用层通过API使用socket(此socket不同于传统意义上的socket)和zeroMQ进行交互
zeroMQ有多个工作者线程,每个工作者线程可以创建多个socket连接对象(由listener监听),也可以作为socket客户端连接远程的对象。
socket套接字对象包括engine、session对象;engine负责连接的管理(和网络进行交互,比如从网络中读取数据,消息排队,接受新的连接等);session对象主要负责和zeroMQ的socket进行交互,他们之间采用异步事件驱动的无锁队列pipe。

zeroMQ在设计上主要采用了以下几个高性能的特征:

1、无锁的队列模型
对于跨线程间的交互(用户端和session)之间的数据交换通道pipe,采用无锁的队列算法CAS;在pipe的两端注册有异步事件,在读或者写消息到pipe的时,会自动触发读写事件。
2、批量处理的算法
对于传统的消息处理,每个消息在发送和接收的时候,都需要系统的调用,这样对于大量的消息,系统的开销比较大,zeroMQ对于批量的消息,进行了适应性的优化,可以批量的接收和发送消息。
3、多核下的线程绑定,无须CPU切换
区别于传统的多线程并发模式,信号量或者临界区, zeroMQ充分利用多核的优势,每个核绑定运行一个工作者线程,避免多线程之间的CPU切换开销。
4 性能分析
目前,市面上类似的产品不少,主要有4种:MSMQ(微软产品)、ActiveMQ(Java)、RabbitMQ(Erlang)、ZeroMQ(C++)。除ZeroMQ外,其它3款产品都是一个单独服务或者进程,需要单独安装和运行,且对环境有一定依赖。其中,MSMQ在非Windows平台下安装非常复杂,ActiveMQ需要目标机器上已经安装了Java,RabbitMQ需要Erlang环境。而ZeroMQ是以库的形式存在,由应用程序加载、运行即可。但是ZeroMQ仅提供非持久性的消息队列。

tcp套接字和zmq套接字之间的区别

1、zmq连接和tcp连接的区别

  • 使用多种协议,inproc(进程内)、ipc(进程间)、tcp、pgm(广播)、epgm;
  • 当客户端使用zmq_connect()时连接就已经建立了,并不要求该端点已有某个服务使用zmq_bind()进行了绑定;
  • 连接是异步的,并由一组消息队列做缓冲;
  • 连接会表现出某种消息模式,这是由创建连接的套接字类型决定的;
  • 一个套接字可以有多个输入和输出连接;
  • ZMQ没有提供类似zmq_accept()的函数,因为当套接字绑定至端点时它就自动开始接受连接了;
  • 应用程序无法直接和这些连接打交道,因为它们是被封装在ZMQ底层的。

2、在传输数据方面的区别

  • ZMQ套接字传输的是消息,而不是字节(TCP)或帧(UDP)。消息指的是一段指定长度的二进制数据块,我们下文会讲到消息,这种设计是为了性能优化而考虑的,所以可能会比较难以理解。
  • ZMQ套接字在后台进行I/O操作,也就是说无论是接收还是发送消息,它都会先传送到一个本地的缓冲队列,这个内存队列的大小是可以配置的。
  • ZMQ套接字可以和多个套接字进行连接(如果套接字类型允许的话)。TCP协议只能进行点对点的连接,而ZMQ则可以进行一对多(类似于无线广播)、多对多(类似于邮局)、多对一(类似于信箱),当然也包括一对一的情况。
  • ZMQ套接字可以发送消息给多个端点(扇出模型),或从多个端点中接收消息(扇入模型)
    单播传输

zeroMQ的传输协议

ZMQ提供了一组单播传输协议(inporc, ipc, tcp),和两个广播协议(epgm, pgm)。广播协议是比较高级的协议,我们会在以后讲述。如果你不能回答我扇出比例会影响一对多的单播传输时,就先不要去学习广播协议了吧。
一般而言我们会使用tcp作为传输协议,这种TCP连接是可以脱机运作的,它灵活、便携、且足够快速。为什么称之为脱机,是因为ZMQ中的TCP连接不需要该端点已经有某个服务进行了绑定,客户端和服务端可以随时进行连接和绑定,这对应用程序而言都是透明的。
1.
进程间协议,即ipc,和tcp的行为差不多,但已从网络传输中抽象出来,不需要指定IP地址或者域名。这种协议很多时候会很方便,本指南中的很多示例都会使用这种协议。ZMQ中的ipc协议同样可以是脱机的,但有一个缺点——无法在Windows操作系统上运作,这一点也许会在未来的ZMQ版本中修复。我们一般会在端点名称的末尾附上.ipc的扩展名,在UNIX系统上,使用ipc协议还需要注意权限问题。你还需要保证所有的程序都能够找到这个ipc端点。
2.
进程内协议,即inproc,可以在同一个进程的不同线程之间进行消息传输,它比ipc或tcp要快得多。这种协议有一个要求,必须先绑定到端点,才能建立连接,也许未来也会修复。通常的做法是先启动服务端线程,绑定至端点,后启动客户端线程,连接至端点。

核心消息模式

ZMQ的套接字API中提供了多种消息模式。如果你熟悉企业级消息应用,那这些模式会看起来很熟悉。不过对于新手来说,ZMQ的套接字还是会让人大吃一惊的。
让我们回顾一下ZMQ会为你做些什么:它会将消息快速高效地发送给其他节点,这里的节点可以是线程、进程、或是其他计算机;ZMQ为应用程序提供了一套简单的套接字API,不用考虑实际使用的协议类型(进程内、进程间、TPC、或广播);当节点调动时,ZMQ会自动进行连接或重连;无论是发送消息还是接收消息,ZMQ都会先将消息放入队列中,并保证进程不会因为内存溢出而崩溃,适时地将消息写入磁盘;ZMQ会处理套接字异常;所有的I/O操作都在后台进行;ZMQ不会产生死锁。
但是,以上种种的前提是用户能够正确地使用消息模式,这种模式往往也体现出了ZMQ的智慧。消息模式将我们从实践中获取的经验进行抽象和重组,用于解决之后遇到的所有问题。ZMQ的消息模式目前是编译在类库中的,不过未来的ZMQ版本可能会允许用户自行制定消息模式。
ZMQ的消息模式是指不同类型套接字的组合。换句话说,要理解ZMQ的消息模式,你需要理解ZMQ的套接字类型,它们是如何一起工作的。这一部分是需要死记硬背的。
*
ZMQ的核心消息模式有:

  • 请求-应答模式 将一组服务端和一组客户端相连,用于远程过程调用或任务分发。
  • 发布-订阅模式 将一组发布者和一组订阅者相连,用于数据分发。
  • 管道模式 使用扇入或扇出的形式组装多个节点,可以产生多个步骤或循环,用于构建并行处理架构。
    我们在第一章中已经讲述了这些模式,不过还有一种模式是为那些仍然认为ZMQ是类似TCP那样点对点连接的人们准备的:
  • 排他对接模式 将两个套接字一对一地连接起来,这种模式应用场景很少,我们会在本章最末尾看到一个示例。

zmq_socket()函数的说明页中有对所有消息模式的说明,比较清楚,因此值得研读几次。我们会介绍每种消息模式的内容和应用场景。
以下是合法的套接字连接-绑定对(一端绑定、一端连接即可):

  • PUB - SUB
  • REQ - REP
  • REQ - ROUTER
  • DEALER - REP
  • DEALER - ROUTER
  • DEALER - DEALER
  • ROUTER - ROUTER
  • PUSH - PULL
  • PAIR - PAIR
    其他的组合模式会产生不可预知的结果,在将来的ZMQ版本中可能会直接返回错误。你也可以通过代码去了解这些套接字类型的行为。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值