2013-02-05 53 views
7

我刚开始理解并尝试使用ZeroMQ。ZeroMQ - 多个发布者和监听者

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

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

有没有办法直接与ZeroMQ做到这一点,或者我应该实现自己的解决方案?

回答

9

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

在多对多的设置中,这很快就会变得棘手。基本上,这听起来像是你想要某种中心节点,所有节点都可以“连接”,接收来自消息的中心节点,并且如果满足用户的某些条件,则发送消息。由于ZeroMq是一个简单的“电源插座”,而不是一个消息队列(因此​​它的名称,ZeroMQ - 零消息队列),这是而不是可以立即使用。

一个简单的选择可能是让每个节点设置一个UDP广播套接字(不使用ZeroMq,只是常规套接字)。所有节点都可以侦听发生的任何事情,并将其自己的消息“发布”回套接字上,从而有效地将其发送到任何正在侦听的节点。这种设置可以在局域网上运行,也可以在消息丢失的情况下使用(比如周期性状态更新)。如果消息需要可靠(并且可能持久),则需要更先进的全面消息队列。

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

查看关于可用的各种message patterns的ZeroMq指南。通过将输出消息(在服务器PUB套接字上)拆分为两个消息部分(参见multi-part messages),可以添加事件“主题”,包括服务器端过滤,其中第一部分指定“主题”和第二部分包含有效载荷(例如,temp | 46.2,speed | 134)。这样,每个客户端可以注册其对任何主题(或全部)的兴趣,并让服务器仅过滤出匹配的消息。有关详细信息,请参阅this example

基本上,ZeroMq是“只是”对普通套接字的抽象,提供了几种消息传递模式来构建您的解决方案。但是,它可以减轻您繁琐的工作,并提供可伸缩性和卓越性能。但需要一些习惯。查看ZeroMq Guide了解更多详情。

+0

通过阅读一些资源,在我看来,按照我的意思,这样做的最好方法就是在每个节点上创建一个发布套接字,如您所说。这是否意味着我需要明确地向所有这些套接字发送消息?我正在考虑像云一样的MQ,每个组件都可以在其上进行监听和写入,从而允许我添加 - 删除组件,而无需相互修改。不知道我是否清楚自己想做什么。 – user1978591

+0

是的,所有订阅者都需要订阅所有其他发布套接字的节点,这就是为什么我不认为这是可行的解决方案。正如我在我的回答中提到的,另一种方法是基于ZeroMq套接字创建自己的MQ服务或消息服务器。这样节点就不必订阅每个其他节点的套接字,只需要这个服务器的发布套接字。使用ZeroMq创建这个应该不会太难。另一种方法是设置一些现成的东西,比如RabbitMQ。 –

+0

是的,我想我会尝试建立它。非常感谢,你很亲切。 – user1978591