ZeroMQ的模式-Publish-Subscribe

Publish-subscribe Pattern:发布订阅模式。

现实中,并不是所有请求都期待答复,而不期待答复,自然就没有了状态。所以相对于REQ-REP,PUB-SUB模式容易理解也简单得多。广播听过吧?收音机用过吧?就这个意思。

相应地,该模式下的socket也就两种:ZMQ_PUB & ZMQ_SUB。 分别对应电台和收音机。

ZMQ_PUB

ZMQ_PUB主要用来让消息发布者用来散发消息的。所有连接上的peer都能收到由它散发的消息。 zmq_recv(3) 这个API是不能用在这个socket上的,原因显而易见。而zmq_send作用在该socket上时是永远不会阻塞的,如果订阅者异常,发出的消息则会被丢弃。

Summary of ZMQ_PUB characteristics
Compatible peer sockets ZMQ_SUB
Direction Unidirectional
Send/receive pattern Send only
Incoming routing strategy N/A
Outgoing routing strategy Fan out
ZMQ_HWM option action Drop

ZMQ_SUB

很明显,订阅者通过这个socket来接受发布者发布的消息。需要注意的是,在使用该socket时,必须显式地调用zmq_setsockopt ,设置ZMQ_SUBSCRIBE和filter。如果不设置的话,是收不到任何消息的。

Summary of ZMQ_SUB characteristics
Compatible peer sockets ZMQ_PUB
Direction Unidirectional
Send/receive pattern Receive only
Incoming routing strategy Fair-queued
Outgoing routing strategy N/A
ZMQ_HWM option action Drop

总结

PUB-SUB模式一般处理的都不是系统的关键数据。发布者不关注订阅者是否收到发布的消息,订阅者也不知道自己是否收到了发布者发出的所有消息。你也不知道订阅者何时开始收到消息。因此逻辑上,它都不是可靠的。

事实上,即便你先启动订阅者,再启动发布者。订阅者也不一定能收到所有的消息。原因在于:发布者已启动就开始撒布消息,而这时订阅者可能还没有完成连接。如果一定需要保证,则需要做两者的同步。最傻的方法就是让发布者启动之后sleep一会儿再开始发消息,不过这种方式就跟听起来一样不靠谱。

一个订阅者可以订阅多个发布者。同时订阅者通过filter来过滤自己需要的消息,需要注意的时,filter是在订阅端起作用的。也就是说所有消息是会到达所有订阅者处,订阅者根据filter丢掉自己不需要的消息。

时间: 2024-09-30 02:06:41

ZeroMQ的模式-Publish-Subscribe的相关文章

使用Publish/Subscribe 设计模式达到对象间数据同步

对象|设计|数据|数据同步 使用Publish/Subscribe 设计模式达到对象间数据同步 应用程序经常需要更改和交换数据,必须传送这些更改后数据以达到对象的同步,尤其在多窗口用户界面应用程序中更要求这种数据的同步协调,在这一类应用程序中,潜在的数据更新信息一定要反映到所有被包含的子窗体中. 例如一个人员信息管理的应用程序.一次可以打开多个包含一个人名字的窗口,如果你在其中一个窗口中修改并报存了这个人的名字,你将期望对名字改变应立即显示在其它全部窗体内.可以通过使用Publish/Subsc

RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

 <=== RabbitMQ消息队列(三):任务分发机制            上篇文章中,我们把每个Message都是deliver到某个Consumer.在这篇文章中,我们将会将同一个Message deliver到多个Consumer中.这个模式也被成为 "publish / subscribe".     这篇文章中,我们将创建一个日志系统,它包含两个部分:第一个部分是发出log(Producer),第二个部分接收到并打印(Consumer). 我们将构建两个Consum

RabbitMQ(三) -- Publish/Subscribe

`rabbitmq`支持一对多的模式,一般称为发布/订阅.也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消费者. Exchanges 之前的教程中,仅仅使用了基本的消息模型: 生产者产生消息 把消息添加到消息队列 消费者接收消息 而在`rabbitmq完整的消息模型`中,并不是这样的.事实上,生产者并不知道消息是否发送到队列,而是把消息直接发送给`Exchanges`. `Exchanges`的功能理解起来非常简单,它只负责接收生产者发送的数据并把这些数据添加到消息队

ZeroMQ的模式-Requset-Reply

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

使用Publish/Subscribe 设计模式达到对象间数据同步(二)

对象|设计|数据|数据同步 在注册处理期间,subscriber被分配一个独特的标记,用来在event channel中标识subscriber.event channel也使用这个标记索引那些subscriber. 虽然样品应用作为标记目标的杂乱脉冲干扰电码使用,我推荐在你的自己的程序里使用另一个方法产生一个独特的标识符 ( 例如产生一GUID). 使用目录菜单建立3到4个frmList窗口实例.使用新的目录菜单选项创作frmList 的3 或者4 个实例,然后在其中一个窗口中选择一个条目,双

ZeroMQ的模式-Pipeline

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

spring-boot | rabbitMq-Direct模式

RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. RabbitMQ的结构图如下: 几个概念说明: Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体,每个消息都会被投入到一个 或多个队列. Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来. Routing Key:路由关键字,exchange根

设计模式之禅之设计模式-观察者模式

一:观察者模式的定义        --->观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是一个在项目中经常使用的模式        --->定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新 二:观察者模式的角色 ● Subject被观察者        定义被观察者必须实现的职责,它必须能够动态地增加.取消观察者.它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管

php设计模式介绍之观测模式

一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它 们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间 能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你 只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间 的相互依赖与相互从属. 问题 当一个对象的状态发生改变时,你如何通知其他对象?是 否需要一个动态方案――一个就像允许脚本的执行一样,允许自