我刚刚开始了解并尝试 ZeroMQ。
我不清楚如何在两个以上的参与者(发布者和订阅者)之间进行双向通信,以便每个组件都能够在 MQ 上读写。
这将允许创建事件驱动的架构,因为每个组件都可以监听一个事件并回复另一个事件。
有没有办法直接用 ZeroMQ 做到这一点,或者我应该在此基础上实现自己的解决方案?
我刚刚开始了解并尝试 ZeroMQ。
我不清楚如何在两个以上的参与者(发布者和订阅者)之间进行双向通信,以便每个组件都能够在 MQ 上读写。
这将允许创建事件驱动的架构,因为每个组件都可以监听一个事件并回复另一个事件。
有没有办法直接用 ZeroMQ 做到这一点,或者我应该在此基础上实现自己的解决方案?
如果您想要简单的双向通信,那么您只需在每个节点上设置一个发布套接字,然后让每个节点连接到另一个节点。
在多对多设置中,这很快变得难以处理。基本上,听起来您想要某种所有节点都可以“连接”到的中央节点,从中接收消息,如果满足订阅者的某些条件,则向其发送消息。
由于 ZeroMq 是一个简单的“电源插座”,而不是消息队列(因此得名 ZeroMQ - 零消息队列),因此开箱即用是不可行的。
一个简单的替代方法是让每个节点设置一个 UDP 广播套接字(不使用 ZeroMq,只使用常规套接字)。所有节点都可以监听发生的任何事情并将其自己的消息“发布”回套接字上,从而有效地将其发送到任何监听的节点。此设置适用于 LAN 和允许消息丢失的设置(如定期状态更新)。如果消息需要可靠(并且可能是持久的),您需要更高级的完整消息队列。
如果您可以不用持久消息队列,您可以创建一个基于中央节点的解决方案,一个中央消息处理程序,所有节点都可以订阅和发送数据到该中央节点。基本上,使用一个 REP(响应)套接字(用于传入数据)和一个 PUB(发布者)套接字(用于传出数据)创建一个“服务器”。然后,每个客户端通过 REQ(请求)套接字将数据发布到服务器 REP 套接字,并为服务器 PUB 套接字建立一个 SUB(订阅者)套接字。
查看有关可用的各种消息模式的 ZeroMq 指南。
为了增加一点趣味,您可以添加事件“主题”,包括服务器端过滤,方法是将传出消息(在服务器 PUB 套接字上)拆分为两个消息部分(请参阅多部分消息),其中第一部分指定“主题”,第二部分包含有效负载(例如temp|46.2,speed|134)。这样,每个客户端都可以注册它对任何主题(或全部)的兴趣,并让服务器只过滤掉匹配的消息。有关详细信息,请参阅此示例。
基本上,ZeroMq “只是”对常规套接字的抽象,提供了几种消息传递模式来构建您的解决方案。但是,它使您摆脱了许多繁琐的工作,并提供了与众不同的可伸缩性和性能。不过需要一些时间来适应。查看ZeroMq 指南以获取更多详细信息。