文档章节

(转)ZeroMQ的模式-Requset-Reply

DEC_LIU
 DEC_LIU
发布于 2013/09/06 14:45
字数 1047
阅读 1185
收藏 1

我们先来看看第一种模式:Request-Reply Pattern。 请求应答模式。

Request-Reply这个名字很直白,口语点说就是一问一答。可以使同步的遵循请求序的一问一答,也可以 是异步的不按请求序的一问一答;其中也可以包含各种不同的路由策略——让谁来回答。zeromq定义的为这个模式服务的socket有:ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER以及ZMQ_DEALER. 用他们进行合理的组合,就可以实现现实世界中各种不同的请求应答模式。

分别来看:

ZMQ_REQ

ZMQ_REQ做的事情就是发问,然后收答。发、收必须是严格按序进行。请求时对对端进行Round Robin,遇到异常则阻塞。官方对这个socket的总结如下:

Summary of ZMQ_REQ characteristics
Compatible peer sockets ZMQ_REP
Direction Bidirectional
Send/receive pattern Send, Receive, Send, Receive, …
Outgoing routing strategy Round-robin
Incoming routing strategy Last peer
ZMQ_HWM option action Block

ZMQ_REP

ZMQ_REP做的事情是收问题然后回答。收、发严格按序调用。对收到的问题公平排队,逐一作答。回答发出时遇到异常则直接丢弃,不会阻塞。

Summary of ZMQ_REP characteristics
Compatible peer sockets ZMQ_REQ
Direction Bidirectional
Send/receive pattern Receive, Send, Receive, Send, …
Incoming routing strategy Fair-queued
Outgoing routing strategy Last peer
ZMQ_HWM option action Drop

可以发现,上述两种socket是纯同步的,连用在它们身上的api的调用顺序都有严格定义。而且没有办法动态决定请求的去向。如果要实现更复杂的请求应答模式,就要借助于下面两种socket了。

ZMQ_DEALER

其实ZMQ_DEALER也是同步的,ZMQ_DEALER也叫作ZMQ_XREQ,概念上是request/reply socket的扩展(实现上刚好相反哦)。从名字上可知它是一个代理层。它对收到的消息公平排队,并以RR方式发送消息,在遇到异常时发送阻塞。它的主要 作用是将come in的请求load balance地发送给到对端们。

Summary of ZMQ_DEALER characteristics
Compatible peer sockets ZMQ_ROUTERZMQ_REQZMQ_REP
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy Round-robin
Incoming routing strategy Fair-queued
ZMQ_HWM option action Block

ZMQ_ROUTER

ZMQ_ROUTER是真正的异步。ZMQ_ROUTER socket收到消息时会在消息栈上加一层包含消息来源地址的消息;发送消息时,会将这一层消息取出,将其作为发送的目的地。如果发送时遇到异常,则丢弃 消息。ZMQ_ROUTER通过这种方式做到了不需要保存任何状态便可异步地转发消息,而这一切应用层是看不到的。

Summary of ZMQ_ROUTER characteristics
Compatible peer sockets ZMQ_DEALERZMQ_REQZMQ_REP
Direction Bidirectional
Send/receive pattern Unrestricted
Outgoing routing strategy See text
Incoming routing strategy Fair-queued
ZMQ_HWM option action Drop

总结

归纳总结一下,0mq的Request-Reply模式下有四种socket类型:

  • DEALER: 给连接的对端RR地分发消息,对收到的消息公平排队。
  • REQ:在应用层外发的消息上加一层空消息再发送;在收到消息后去掉分隔空消息再返回应用层。它实质上是在DEALER上构建的,只是在此基础上强制加入了发、收循环。
  • ROUTER:针对每一个收到的消息:加一层来源地址段,然后再交给应用层;针对每一个要发出的消息:去掉最上层的地址段,并以该地址段为目的地进行发送。
  • REP:对收到的消息:储存所有的消息内容直到第一个分隔空消息段,把剩余的消息体传给应用层;对发出的消息:把之前储存的消息体加回来,并像ROUTER一样发送出去。它实质上实在ROUTER上构建的,只是在此基础上强制加入了收、发循环。

有了这几种socket,便可以组合成各种Request-Reply模式了:

[REQ] <--> [REP] [REQ] <--> [ROUTER--DEALER] <--> [REP] [REQ] <--> [ROUTER--DEALER] <--> [ROUTER--DEALER] <--> [REP]...

举个例子,N个client要给M个worker提交任务,worker完成任务后返回给client;worker需要平衡负载以避免某一 worker过于劳累,client发出的请求也有先后之说,不能让后发的请求先于之前的被交给worker。这番描述的socket组合便可如下图 (from the guide)方式构建:

© 著作权归作者所有

DEC_LIU
粉丝 27
博文 18
码字总数 9469
作品 0
浦东
架构师
私信 提问
AAuto v1.1.21 同时支持ZeroMQ与Protobuf

ZeroMQ网络库提供一些跨多种传输协议(如进程内通讯、IPC、TCP和广播)的套接字供你使用,可使用多种方式实现N对N的套接字连接。ZeroMQ非常适合与Protobuf结合使用,并且与Protobuf一样在很多...

qqmmcc
2011/11/20
2.1K
1
高性能的通讯库-zeroMQ的几个高性能特征

这两天研究了一下zeroMQ,号称史上最好的通讯库,比rabbitMQ快很多,基于c语言开发的,实时流处理sorm的task之间的通信就是用的zeroMQ。 zeroMQ在使用模式上支持多种,有req-reply,publish...

天下杰论
2014/10/08
512
0
ZeroMQ学习:window下编译zeromq-3.2.3和jzmq-master

最近发现公司项目中用的activemq队列总出现这样那样的问题,可能没有相关告诉解决,很是头疼。作为个人来说也很想寻找一款跨语言、高速的消息队列“玩一玩”,发现zeromq比较满足这个要求。 ...

DEC_LIU
2013/09/05
4.7K
0
[架构] ZeroMQ 深度探索(一)

序 最初认识 ZeroMQ 是被它的名号所吸引,最近在一个高性能中间件的项目中用到了 ZeroMQ,对这个号称“史上最快的消息队列”有了更深层次的了解。如果我们仅仅把 ZeroMQ 看作是一个消息队列,...

长平狐
2013/07/01
8.1K
0
使用 ZeroMQ 实现分布式消息系统

“分布式系统是你甚至不知道的一台计算机上的故障可以使您自己的计算机不可用。”-Leslie Lamport 随着云计算的普及和可用性,分布式系统架构已很大程度上取代了更多的整体构建。当然,使用面...

oschina
2015/05/11
20.9K
21

没有更多内容

加载失败,请刷新页面

加载更多

全面兼容IE6/IE7/IE8/FF的CSS HACK写法

浏览器市场的混乱,给设计师造成很大的麻烦,设计的页面兼容完这个浏览器还得兼容那个浏览器,本来ie6跟ff之间的兼容是很容易解决的。加上个ie7会麻烦点,ie8的出现就更头疼了,原来hack ie...

前端老手
28分钟前
5
0
常用快递电子面单批量打印api接口对接demo-JAVA示例

目前有三种方式对接电子面单: 1.快递公司:各家快递公司逐一对接接口 2.菜鸟:支持常用15家快递电子面单打印 3.快递鸟:仅对接一次,支持常用30多家主流快递电子面单打印 目前也是支持批量打...

程序的小猿
31分钟前
6
0
Yii 框架中rule规则必须搭配验证函数才能使用

public $store_id;public $user_id;public $page;public $limit;public $list;public $mch_list;public $cart_id;public $is_community;public $shop_id;public $cart_typ......

chenhongjiang
34分钟前
4
0
Flutter使用Rammus实现阿里云推送

前言: 最近新的Flutter项目有“阿里云推送通知”的需求,就是Flutter的App启动后检测到有新的通知,点击通知栏然后跳转到指定的页面。在这里我使用的是第三方插件Rammus来实现通知的推送,之...

EmilyWu
34分钟前
43
0
Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

短网址顾名思义就是使用比较短的网址代替很长的网址。维基百科上面的解释是这样的: 短网址又称网址缩短、缩短网址、URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短...

阿里巴巴云原生
49分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部