【发布时间】:2014-08-28 13:40:27
【问题描述】:
我必须开发一个消息总线,供进程相互发送、接收消息。目前,我们在 Linux 上运行,以便以后移植到其他平台。
为此,我在 TCP 上使用 ZeroMQ。模式是带有转发器的 PUB-SUB。我的总线作为一个单独的进程运行,所有客户端都连接到 SUB 端口以接收消息,并连接到 PUB 以发送消息。每个进程通过一个唯一的标签订阅消息。来自进程的send 调用向所有人发送消息。 receive 调用将获取该进程标记有该进程标记的消息。这工作正常。
现在我需要包装 ZeroMQ 的东西。我的客户只需要提供一个独特的标签。我需要维护标签与 ZeroMQ 上下文和套接字详细信息的全局列表。当客户说,
initialize_comms("name"); 总线需要检查这个名字是否唯一,创建 ZeroMQ 上下文和套接字。同样,如果客户端说receive("name");,总线需要获取带有该标签的消息。
总结一下我面临的问题;
- 有没有办法使用 ZeroMQ 提供的工具来实现这一点?
- ZeroMQ 是解决此问题的正确工具吗,还是我应该寻找类似 nanomsg 的工具?
- 带有转发器的 PUB-SUB 是正确的模式吗?
- 或者,我在这里遗漏了什么?
【问题讨论】:
-
您可以查看OMG DDS(数据分发服务)标准。从您的(简短)描述来看,它似乎很合适,并提供了您正在寻找的那种抽象。
-
我不完全清楚为什么 ZMQ 的正常订阅没有完全涵盖您想要做的事情。
-
@ReinierTorenbeek > 感谢您的指点。快速浏览一下,该理论非常适合我的想法,但似乎没有那么多开源实现。我会留意的。
-
@Jason > 实际上我对 ZeroMQ 很陌生,所以你可能是对的。为什么我选择带有 FORWARDER 的 PUB-SUB 是因为我不能使任何进程成为静态的。他们可以随心所欲地来来去去,所以我需要一个静态的接触点,而这正是 FORWARDER 适合的地方。
-
似乎是一个合理的选择。如果您还没有阅读the guide,我强烈建议您阅读...如果您有几周的时间以自然的速度完成它并在此过程中吸收它,它会回答您的大部分问题问题。特别是,您提到“创建 ZeroMQ 上下文”......通常每个进程只需要一个,并且所有套接字都属于该上下文。您可以将多个套接字连接到每个绑定套接字,因此您甚至可能不需要按需启动多个套接字。这样的事情可以极大地简化您的架构。