如何将 ZeroMQ 用于多个服务器-客户端对?

How to use ZeroMQ for multiple Server-Client pairs?

我正在使用多线程在 C++14 中实现性能要求很高的两方协议,目前正在使用 ZeroMQ 作为网络层。

该应用程序具有以下简单架构:

我当前的设计在 serverclient 上使用单个 ZeroMQ Context()-实例,所有 n-本地线程和每个各自的 client/server 线程对创建一个 ZMQ_PAIR 套接字(我只是增加端口号)用于通信的本地共享上下文。

我的问题

有没有更聪明或更有效的方法?

即:是否有使用 ROUTERSDEALERS 的自然方式可以提高性能?

我在套接字编程方面经验不多,采用我的方法,套接字的数量直接与 n(许多客户端-服务器线程对)成比例。这可能会达到几千,我不确定这是否是个问题。

我可以控制服务器和客户端机器以及源代码,我没有需要担心的外部限制。我只关心性能。

我查看了所有模式 here,但我找不到任何匹配客户端-服务器对固定的情况的模式,即我不能使用负载平衡等。

快乐的人!

ZeroMQ 是一个可爱而强大的工具,可用于高度可扩展、低开销、正式通信(行为,是模拟某种对等相互行为 "One Asks, the other Replies" 等al ) 模式.

您的模式非常简单,行为不受限制,ZMQ_PAIR 可能很适合这个。


性能

关于此属性的定量性质应该有更多详细信息。

  • 进程间延迟[us]
  • 被测系统 (SuT) 架构的内存足迹 [MB]
  • SuT 可以处理的数据流峰值[MB/s]

性能提示(如果观察到的性能数据在数量上支持)

  • 可以通过在实例化时增加Context( nIOthreads )来增加I/O-performance

  • 可以通过硬映射个体thread#->Context.IO-thread#微调I/O-performance这对分布式工作负载并允许一个人保持 "separate" 本地主机 IOthread(s) 免费/准备好更高优先级的信号和其他此类需求。

  • 设置应用程序特定的 ToS - 优先类型流量的标签,以便允许在 clientserver

  • 之间的路由段旁边的网络层上进行高级处理
  • 如果内存占用受到影响(ZeroMQ 不是操作系统内核级别的 TCP 协议处理的零拷贝),可能 尝试移动到ZeroMQ 的妹妹——由 ZeroMQ 的共同之父 Martin SUSTRIK 编写——符合 POSIX 的 nanomsg,具有相似的动机和有吸引力的性能数据。至少值得了解一下。


能否ROUTERDEALER提高整体表现?

不,不能。考虑到您声明的架构(声明为通信量大),其他更复杂的可扩展正式通信模式行为适合其他一些需求,不会增加任何性能优势,但相反,会在不交付的情况下花费额外的处理开销任何合理的改进。

虽然您的正式沟通仍然如定义的那样,但不需要额外的花里胡哨。

ZMQ_PAIR 原型上可能会注意到一点,一些消息来源称这是一个实验性原型。如果你的直觉感觉不让你,除了 SuT 测试观察之外,乐于接受这个,不要介意轻微的重新设计步骤,这将使你拥有所有非 pre[ 的自由=94=]-scried 正式通信模式行为,同时在引擎盖下有 "non"-实验管道——只需用一对 ZMQ_PUSH + ZMQ_PULL[ 替换独奏 ZMQ_PAIR =94=] 并使用单程票发送消息。完全控制 SuT 的设计和实施,这一切都在您的能力范围内。


我能走多快?

针对 ZeroMQ 或 nanomsg 性能/延迟包络发布了一些基准测试记录,用于跨无流量路由段的卸载网络传输(确定)。

如果您的 SuT-设计力求更快——比如在一些 800 ns 端到端下,还有其他方法可以实现这一点,但是您的设计必须遵循其他分布式计算策略而不是基于消息的数据交换,并且您的项目预算将不得不调整必要的超低延迟硬件基础设施的额外支出。

这可能令人惊讶,但绝对可行并且对系统来说非常有吸引力,其中数百 纳秒 是托管数据中心内的必备目标。