ZeroMQ的模式-Requset-Reply

我们先来看看第一种模式: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]
...
时间: 2024-09-08 11:54:58

ZeroMQ的模式-Requset-Reply的相关文章

ZeroMQ的模式-Pipeline

Pipeline pattern 管道模式. 这种模式描述的场景是数据被散布到以管道方式组织的各个节点上.管道的每一步都连接一个或多个节点,连接多个节点时数据以RR方式往下流. 注意是流,意味着数据跟发布模式一样是单向的.这个模式对应的socket是ZMQ_PUSH和ZMQ_PULL. ZMQ_PUSH 用来向下游节点发消息.下游多个节点时采取RoundRobin分发,zmq_recv()对于这个socket也是无效的. 与Pub不同的是,当下游节点达到高水位(HWM)或者根本没有下游节点时,z

ZeroMQ的模式-Publish-Subscribe

Publish-subscribe Pattern:发布订阅模式. 现实中,并不是所有请求都期待答复,而不期待答复,自然就没有了状态.所以相对于REQ-REP,PUB-SUB模式容易理解也简单得多.广播听过吧?收音机用过吧?就这个意思. 相应地,该模式下的socket也就两种:ZMQ_PUB & ZMQ_SUB. 分别对应电台和收音机. ZMQ_PUB ZMQ_PUB主要用来让消息发布者用来散发消息的.所有连接上的peer都能收到由它散发的消息. zmq_recv(3) 这个API是不能用在这个

Hiredis_API说明

 同步的API接口 redisContext *redisConnect(const char *ip, int port); void *redisCommand(redisContext *c, const char *format, ...); void freeReplyObject(void *reply); 1)建立连接 redisContext *c = redisConnect("127.0.0.1", 6379); if (c != NULL &&

WCF从理论到实践(7):消息交换模式

本文的出发点 通过阅读本文,您能理解以下知识: WCF定义了哪几种消息交换模式? One-Way Calls Request/Reply Duplex 用示例来解析WCF的消息交换模式 本文适合的读者 本文涉及到了SOA中的消息交换的基础概念,需要一些初级的Xml Web Service和分布式系统开发的经验,最好理解WCF架构 WCF定义了哪几种消息交换模式? WCF定义了三种消息交换方式 ,分别为: One-Way Calls Request/Reply Duplex One-Way Cal

Redis的Pub/Sub模式

Redis同样支持消息的发布/订阅(Pub/Sub)模式,这和中间件activemq有些类似.订阅者(Subscriber)可以订阅自己感兴趣的频道(Channel),发布者(Publisher)可以将消息发往指定的频道(Channel),正式通过这种方式,可以将消息的发送者和接收者解耦.另外,由于可以动态的Subscribe和Unsubscribe,也可以提高系统的灵活性和可扩展性. 关于如何搭建Redis环境,请参考其他文章.这里假设有一个可用的Redis环境(单节点和集群均可). 在red

LVS三种模式与八种调度算法

三种LVS负载均衡模式 1.NAT模式网络地址转换,工作在网络层(三层),只有VIP是公网IP,其余都是私网IP,Real Server指定LVS为网关,LVS开启路由转发,源和目标地址转换,数据的进出期间,无论是进来的流量,还是出去的流量,都必须经过DR,会产生一种瓶颈,适合小网络,规模10台左右. 工作原理: 1>.用户发送请求报文到LVS的VIP上,VIP选择一个Real Server,并记录连接信息到hash表中,然后修改用户的请求报文的目的IP地址为Real Server的地址,将请求

WCF 双工模式

WCF之消息模式分为:1.请求/答复模式2.单向模式3.双工模式 其中,请求/答复模式,在博文:  WCF 入门教程一(动手新建第一个WCF程序并部署) WCF 入门教程二 中进行了详细介绍,此处将主要介绍:单向模式与双工模式. 1.首先,先创建一个WCF应用程序: 创建完成后,目录如下: 2.删除IService1.cs和Serivce1.svc,或者修改名称为:CalculateService.svc与ICalculateService.cs后,显示如下: 3.ICalculateServi

Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时,实际上是由ASP.NET管道解决了这两个问题.具体来说,ASP.NET自身的URL路由系统借助于HttpControllerHandler这个自定义的HttpHandler实现了ASP.NET管道和ASP.NET Web API管道之间的"连通",但是在Self Host寄宿模式下,请求的

让 ZeroMQ 为 MySQL 提供远程分布式任务处理

昨天写了一篇博文    身份证校验,检查身份证号码输入是否正确 http://netkiller-github-com.iteye.com/blog/1997402   很多人担心性能问题,我后来想用C写一个扩展,还会有人说影响性能,一不做二不休,干脆mq到远程,通过负载均衡解决.   这里只是提供了一个 MySQL 与 ZeroMQ 通信的插件,我并没有将身份证校验程序写出来.不过MQ的服务端可以使用很多语言实现,c,Java, php,Python,perl,ruby ..... 你自己选择