ZMQ Guide学习笔记(1)--模式简介

ZeroMQ,也可以叫做zmq,0mq或者ØMQ,是时下流行的一种轻量级消息队列方式。相较于kafka等需要中间件的消息队列而言而言,zmq更快,更轻,你只需要几十行甚至更少的代码就能实现消息类型的切换。常用的ZMQ模式有Request-Reply, Pub-Sub,Push-Pull等。如果你的需要快速的实现一个简单系统,那么相信zmq是一个不错的选择。另外,zmq支持Java、Python、C++等多种语言,对于架构未来的可扩展性也有很大的弹性。


下面是zmq基本类型的描述,示例代码可以从zguide获取。重点描述这些模式的缺点,因为相信大多数同学都可以一眼看出模式的有点,但单单只会用模式还是不够的。一位国内顶尖的CPU专家曾告诉楼主,"技术人员要永远对技术本身怀着一颗敬畏的心",runnable的程序很容易写出来,但是否稳健又是另外一回事,希望楼主能够帮助新使用zmq的同学们跳过这些“坑”。楼主主要使用python和C++,因此引用的代码也是C++代码,各位可以根据自己使用的语言找示例代码。


Reuest-Reply



如图所见,requst-reply的交互方式很简单,客户端发送请求后,服务端予以回应。详细代码可参考hwserver.cpp和hwclient.cpp

坑:

  1. R-R模式最大的问题是如果一旦request-reply的节奏被破坏掉,后续的交互将会不能进行。如何解决这个问题呢?Zmq提供了很多种解决方法,其中Lazy的楼主觉得Lazy Pirate模式比较简答^^, 简答来说就是client超时后加一个重试逻辑,在server比较可靠的前提下,这是一个不错的选择;
  2. Request端是阻塞模式,在Server busy的时候,并不会立刻返回。对于问题,楼主觉得asyncsrv.cpp里的异步模型不错,或者用Dealer-Dealer,94有点麻烦,当然有熟悉zmq的同学觉得其他模式也可以解决此问题。毕竟没有一种模式是完美的;

Pub-Sub



这种模式的可用于大规模的数据分发,同时sub端也可以订阅多个pub,示例代码为wuclient.cpp和wuserver.cpp。
坑:
  1. 如果在pub时,sub端口没有连接上pub,将会错误消息。处理这类问题的方法有很多,但多是都无法彻底解决,除非你有所有消息都存下来==!
  2. 如果sub太慢,推送队列将会堆积,最后溢出;
  3. 没有sub连接时,推送的消息将会被丢弃;
  4. zmq4.2版本的一个bug:如果sub端不停重连pub端,同时pub端没有数据推送出来,最后pub端会存在内存泄漏的风险;
  5. 通过外网IP跨机房使用pub-sub模式,在长时间无消息推送的时候,容易出现pub连接为establish,sub连接已经关闭的情况,初步怀疑是sub端发送的FIN+RST报文被丢弃所致(SO_LINGER=0),可能市值SO_LINGER可以解决这个问题,这个方法楼主并没有尝试过,有兴趣的同学可以试试;

PUSH-PULL

和pub-sub不同,pub-sub是一种“all of many”的模式,push-pull是"one of many"。上图中,PUSH可以为1个端口,PULL为多个端口。
坑:
如果没有PULL或者由于PULL处理太慢,导致通道阻塞(跟PUSH端的HWM设置相关,HWM的具体含义可以百度一下,楼主也会在后续博客中),那么PUSH端发送数据时将会阻塞;

先写到这里,有空再更新……

参考文献:
http://zguide.zeromq.org/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ZeroMQ—指导 由iMatix公司的首席执行官Pieter Hintjens 编写。感谢Bill Desmarais, Brian Dorsey, CAF, Daniel Lin, Eric Desgranges, Gonzalo Diethelm, Guido Goldstein, Hunter Ford, Kamil Shakirov, Martin Sustrik, Mike Castleman, Naveen Chawla, Nicola Peduzzi, Oliver Smith, Olivier Chamoux, Peter Alexander, Pierre Rouleau, Randy Dryburgh, John Unwin, Alex Thomas, rofl0r, Mihail Minkov, Jeremy Avnet, Michael Compton, and Zed Shaw的贡献,也感谢Stathis Sideris,因为Ditaa.。 请对所有的意见和勘误表进行问题跟踪。这个版本覆盖了0MQ2.0的版本,发表于周二2010年11月9日,9时32分19秒。 第一章——基础的东西 修理(fixing)这个世界 怎么解释0MQ?有些人会说它的所有美好的事情。它是类固醇(steroids)上的套接字。它像有路由的邮箱。它很快。别人想分享它的启蒙,当这一切变得越来越明显,人们开始顿悟了。事情变得更简单。再也不复杂了。它打开了人们的思维。其他人喜欢通过做比较的方式来解释。它更小,更简单,但是看起来仍然很熟悉。就我个人而言,我希望回忆起我们为什么要开发0MQ,因为,这是读者们也很想知道的问题。 编程是装扮成艺术的科学,因为我们中的大多数不了解软件的物理过程。如果学过这方面的知识的话,也学的很少。软件的物理过程不是算法,数据结构,语言和抽象。这些只是我们研发,使用,然后扔掉的工具。软件真正的物理过程实际上是人们的思维过程。 ……

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风暴蓝熊猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值