使用ZeroMQ实现消息总线

时间:2014-07-07 23:05:47

标签: sockets ipc zeromq

我必须开发一个消息总线,用于进程发送,接收彼此的消息。目前,我们正在Linux上运行,以便稍后移植到其他平台。

为此,我使用ZeroMQ over TCP。模式是带有转发器的PUB-SUB。我的总线作为一个单独的进程运行,所有客户端连接到SUB端口以接收消息,PUB发送消息。每个进程都通过唯一标记订阅消息。来自进程的send调用会向所有人发送消息。 receive调用将获取该进程标记有该进程标记的消息。这很好。

现在我需要包装ZeroMQ的东西。我的客户只需要提供一个独特的标签。我需要维护一个全局的标签列表与ZeroMQ上下文和套接字的详细信息。当客户说, initialize_comms("name");总线需要检查此名称是否唯一,创建ZeroMQ上下文和套接字。同样,如果客户端说receive("name");,则总线需要使用该标记获取消息。

总结我所面临的问题;

  1. 无论如何使用ZeroMQ提供的设施实现这一目标?
  2. ZeroMQ是否适合这个,或者我应该寻找像nanomsg这样的东西吗?
  3. 带有转发器的PUB-SUB是否具有正确的模式?
  4. 或者,我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:7)

<强>答案

  1. ZeroMQ能够满足此需求

  2. 即可。 ZeroMQ是一个正确的工具(而不是一个强大的低延迟组件工具箱)。虽然nanomsg具有直接的总线原语,但核心分布式逻辑可以集成在ZeroMQ框架中

  3. 是&amp;否即可。上面给出的PUB-SUB可以用于仿真&#34; shout-cast&#34; -to-bus并且建立在使用订阅密钥的SUB副作用上。必须重新思考和设计整个逻辑的静态,以便整个制造范围符合您的计划(参见下文)。另外请记住,ZeroMQ的初始版本操作PUB / SUB原语作为&#34;订阅过滤&#34;接收方传入的消息流,因此大规模的设计应检查大规模的流量/洪水风险/流程效率低......

    < / LI>
  4. 即可。 ZeroMQ是一个经过精心调整的原始元素基础(就讨论架构,而不是其功率和性能)来构建更聪明,更强大的基础元素。几乎可线性扩展的正式通信模式。草绘架构后,不要再遇到PUB / SUB或PAIR原语。 如果有人忘记 True Powers 的来源,任何设计都会很差。

  5. 开始迈向可伸缩和放大的下一步的好地方故障恢复总线

    因此,最好的下一步可能是恕我直言,以获得更多的全局视图,这对于尝试使用ZeroMQ进行编码的前几个事情听起来很复杂,但是如果你 at least jump to the page 265 [Code Connected, Volume 1] [available asPdf >>> http://hintjens.wdfiles.com/local--files/main%3Afiles/cc1pe.pdf ]中的强>,如果不是逐步阅读的话。

    最快的学习曲线是首先在图60 重新发布更新图62 HA克隆服务器对可用于高可用性方法,然后返回到根,元素和详细信息。

答案 1 :(得分:4)

如果有人感兴趣的话,这就是我最终设计的内容。感谢大家的提示和指示。

  1. 我使用 ZeroMQ (和 CZMQ )实施的消息总线作为单独的进程运行。
  2. 该模式是PEMLISHER-SUBSCRIBER和LISTENER。它们使用PROXY连接。
  3. 此外,还有一个使用新分叉线程调用的ROUTER。
  4. 这三个端点在TCP上运行,并绑定到客户端知道的预定义端口。
  5. PUBLISHER接受来自客户的所有邮件。
  6. SUBSCRIBER将具有唯一标记的邮件发送给已订阅该标记的客户。
  7. LISTENER收听所有传递的邮件。目前,这是用于日志记录测试和目的。
  8. ROUTER为客户提供单独的通讯渠道。控制命令之类的消息将在此处定向,以便它们不会传递到下游。
  9. 客户端连接到,
    1. PUBLISHER发送消息。
    2. SUBSCRIBER接收消息。订阅使用唯一标记。
    3. 发送命令的路由器(检查标签唯一性等)
  10. 我仍在执行,因此可能会出现看不见的问题,但现在它可以正常工作。此外,可能有更优雅的方式,但我不想丢弃我建立的PUB-SUB。