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