ZeroMQ - 多个发布者和监听者

use*_*591 7 zeromq

我刚开始理解并尝试ZeroMQ.

我不清楚如何在两个以上的actor(发布者和订阅者)之间进行双向通信,以便每个组件都能够在MQ上进行读写.

这将允许创建事件驱动的体系结构,因为每个组件可以监听事件并回复另一个事件.

有没有办法直接使用ZeroMQ,或者我应该在此基础上实现我自己的解决方案?

Jak*_*lås 9

如果您想要简单的双向通信,那么您只需在每个节点上设置一个发布套接字,并让每个节点连接到另一个节点.

在多对多的设置中,这很快变得棘手.基本上,听起来你想要某种中心节点,所有节点都可以"连接",接收消息,如果满足用户的某些条件,则发送消息.

由于ZeroMq是一个简单的"电源插座",而不是一个消息队列(因此它的名字,ZeroMQ -零消息队列),这是超出现成可行的.

一个简单的替代方案可以是让每个节点设置一个UDP广播套接字(不使用ZeroMq,只使用常规套接字).所有节点都可以监听发生的任何事情并将其自己的消息"发布"回套接字,有效地将其发送到任何侦听节点.此设置适用于LAN以及可以使消息丢失的设置(如周期性状态更新).如果消息需要可靠(并且可能持久),则需要更高级的完整消息队列.

如果您可以不使用持久消息队列,则可以基于中央节点(中央消息处理程序)创建解决方案,所有节点都可以订阅并向其发送数据.基本上,创建一个"服务器",其中包含一个REP(响应)套接字(用于传入数据)和一个PUB(发布者)套接字(用于传出数据).然后,每个客户端通过REQ(请求)套接字将数据发布到服务器REP套接字,并为服务器PUB套接字设置SUB(订阅者)套接字.

查看ZeroMq指南,了解可用的各种消息模式.

为了增加一点,你可以添加事件"主题",包括服务器端过滤,通过将传出消息(在服务器PUB套接字上)分成两个消息部分(参见多部分消息),其中第一部分指定"topic"和第二部分包含有效载荷(例如temp | 46.2,speed | 134).这样,每个客户端都可以在任何主题(或全部)中注册其兴趣,并让服务器仅筛选出匹配的消息.请参阅此示例以获取详细信

基本上,ZeroMq"只是"对常规套接字的抽象,提供了几种消息传递模式来构建您的解决方案.但是,它减轻了许多繁琐的工作,并提供了与众不同的可扩展性和性能.虽然需要一些时间来适应.查看ZeroMq指南了解更多详情.

  • ZMQ提供了一种设备,可以简单地将消息从一个套接字(可能是一个"子"袜子)转发到另一个套接字(可能是"酒吧袜子").对于双向异步通信,只需给每个actor一个pub和sub sock,然后将actor的pub socks连接到转发器的子袜子(反之亦然).在转发器设备中使用`bind`,在actor中使用`connect`.现在,您为所有演员提供了一个连接点. (2认同)