sockets - 如何使用 ZeroMQ 有效地建立点对点 channel ?

标签 sockets zeromq messaging

我无法使用 ZeroMQ 建立异步点对点 channel 。

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

enter image description here

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

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

但我想知道是否有人使用ZMQ_PAIR套接字有效地建立点对点 channel ?或者有没有办法绕过为多个 设置不同的主机 IP 地址ZMQ_PAIR 要绑定(bind)的套接字?

最佳答案

问:如何有效地建立……嗯,

鉴于上述叙述,“如何有效地......”的故事(关于什么和如何实际衡量所需有效性的指标可能会在稍后得到进一步澄清),变成另一个问题 - “我们可以重新 -考虑 ZeroMQ 信令/消息传递基础设施,以便在不使用 tcp:// -transport-class 拓扑实际需要的那么多 IP 地址:端口#-s 的情况下工作?"

根据明确表示的限制,即不超过一个 IP:PORT#每个主机/节点(因此架构/设计是非常,如果不是最昂贵的资源),在这种前进的道路上必须克服很多麻烦。

公平地指出,任何此类尝试都需要支付额外费用。不会有任何魔杖可以“绕过”上述主要限制。所以准备好真正支付成本。

它让我想起了 TELCO 的一个项目,其中 以相似的方式运作,具有相似的原始动机。每个节点都有一个 ssh/sshd服务设置,其中启用本地端口转发以仅公开一个可公开访问的 IP:PORT# 访问点,其余所有都在通过 ssh 隧道的所有拓扑链接的网格“内部”实现,这不仅仅是因为加密服务,但是由于能够保持所有本地端口转发到特定远程端口的舒适性,作为如何在所有服务节点之间设置和操作此类专有对等链接的一种手段,但是每个节点只有一个公共(public)访问 IP:PORT#。

如果没有其他方法似乎可行 ( PUB/SUB 被驱逐,因为在较旧的 ZeroMQ/API 版本中实际流向每个终端节点的流量,其中主题过滤被处理但在 SUB 端,安全和网络部门都不喜欢支持, 或用于 PUB 端的集中工作负载和巨大的资源需求,在较新的 ZeroMQ/API 版本的情况下,主题过滤器正在发送者端进行处理。寻址,动态网络对等(重新)发现,维护,资源规划,故障恢复,...,是的,似乎没有任何简单的捷径可以接近并(重新)使用)上面提到的“石器时代”ssh/sshd使用 ZeroMQ 的端口转发,仅针对此类本地端口运行,可以节省您的时间。

无论如何 - 祝你狩猎好运!

关于sockets - 如何使用 ZeroMQ 有效地建立点对点 channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49187357/

相关文章:

c - 套接字 C - Windows

c++ - 使用 Ubuntu 在 C/C++ 中的 UDP 套接字发送限制

ruby - 如何处理ZeroMQ + Ruby中的线程问题?

python - 为什么 ZeroMQ req-rep 在 C++ 和 Python 之间给我一个空响应?

MySQL JOIN 查询 - 消息系统

java - 高性能非阻塞有序消息处理程序

silverlight - Silverlight 访问策略的访问频率是多少?

java - 如何模拟客户端和服务器之间的套接字断开连接(在 Windows 上)?

python - 为什么 ZMQ 不会丢弃消息?

javascript - 在chrome扩展程序和应用程序中实现跨扩展程序消息传递