ZeroMQ - 多个发布者和监听者

时间:2013-02-05 17:49:18

标签: zeromq

我刚开始理解并尝试ZeroMQ。

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

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

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

1 个答案:

答案 0 :(得分:9)

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

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

由于ZeroMq是一个简单的“电源插座”,而不是消息队列(因此​​它的名称,ZeroMQ - 零消息队列),因此可行的开箱即用。< / p>

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

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

查看有关各种message patterns可用的ZeroMq指南。

为了增加一点点,您可以通过将传出消息(在服务器PUB套接字上)拆分为两个消息部分(参见multi-part messages)来添加事件“主题”,包括服务器端过滤。第一部分指定“主题”,第二部分包含有效负载(例如 temp | 46.2 speed | 134 )。这样,每个客户端都可以在任何主题(或全部)中注册其兴趣,并让服务器仅筛选出匹配的消息。有关详细信息,请参阅this example

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