如何使用ZeroMQ有效建立点对点通道?

How to effectively establish point to point channel using ZeroMQ?

我在使用 ZeroMQ 建立异步点对点通道时遇到了问题。

我构建点对点通道的方法是它生成尽可能多的 ZMQ_PAIR 套接字,最多达到网络中对等点的数量。因为ZMQ_PAIR socket保证了两个peer之间的独占连接,所以需要相同数量的peer。我的第一次尝试实现为下图,表示两个对等点之间的配对连接。

但上述方法的问题是每个配对套接字都需要一个不同的绑定地址。例如,如果网络中有四个对等点,那么每个对等点至少应该有三个( TCP )地址来绑定其余对等点,这是非常不现实和低效的。
(我假设 peer 在其他地址中只有一个唯一地址。例如 tcp://*:5555

似乎除了使用不同的模式之外别无他法,其中包含一些消息代理集,例如XREQ/XREP
(我有意避免基于代理的方法,因为我的应用程序将在对等点之间大量交换消息,这通常会导致代理进程出现性能瓶颈。)

但是我想知道有没有人用ZMQ_PAIR套接字来高效地建立点对点通道?或者有没有办法绕过多个 ZMQ_PAIR 套接字绑定不同的主机 IP 地址?

问:如何有效建立...嗯,

鉴于上述叙述,"How to effectively ..." 的故事(其中关于实际衡量所需有效性的内容和方式的指标可能会在稍后得到进一步澄清),变成另一个问题 - “我们能否 re-factor ZeroMQ 信令/消息传递基础设施,以便在不使用基于 tcp://-transport-class 的拓扑结构实际需要的那么多 IP-addresses:port#-s 的情况下工作?"

根据明确表示的限制,即每个 host/node 不超过一个 IP:PORT#(因此架构/设计即使不是最昂贵的资源也是非常昂贵的)在这样的前进道路上克服了很多困难

需要注意的是,任何此类尝试都需要支付额外费用。 "bypass" 上面表示的这种主要限制不会有任何魔术棒。所以准备好支付费用吧。

这让我想起了电信公司的一个项目,其中一个 以类似的方式以类似的原始动机进行操作。每个节点都有一个 ssh/sshd 服务设置,其中 local-port 启用转发以公开一个 public 可访问的 IP:PORT# access-point,其余的都已实现 "inside" 所有通过 ssh-tunnels 的拓扑链接组成的网格,不仅因为加密服务,而且因为能够维护所有 local-port- 转发到特定 remote-ports 作为一种在所有 service-nodes 之间设置和操作这种独占 peer-to-peer 链接的方法,但每个节点只有一个 public 访问 IP:PORT#。

如果没有其他方法似乎可行 ( PUB/SUB 在较旧的情况下,实际流向每个终端节点的任一流量都被驱逐 ZeroMQ/API 版本,其中 Topic-filtering 得到处理但在 SUB 端,安全和网络部门都不想支持,或者 PUB 上集中的工作负载和巨大的资源需求-side,在较新的 ZeroMQ/API 版本的情况下,其中 Topic-filter 正在发送方处理。寻址,动态网络对等(重新)发现,维护,资源规划,故障恢复,... ,是的,似乎没有任何简单的捷径可以接近并(重新)使用) 上面提到的 "stone-age" ssh/sshd-port-forwarding 使用 ZeroMQ,运行 仅针对此类 local-ports,可能会拯救你。

无论如何 - 祝你狩猎顺利!