ZMQ经销商路由器以高频率丢失消息?

时间:2015-01-31 00:52:27

标签: python zeromq pyzmq

我使用DEALER ROUTER pyzmq 发送20000条消息。

当我在每条消息之间暂停0.0001秒时,它们都会到达,但如果我通过暂停每条消息0.00001发送它们的速度提高了10倍,那么只有大约一半消息到达。

导致问题的原因是什么?

1 个答案:

答案 0 :(得分:5)

导致问题的原因是什么?

ZMQ IO线程的默认设置 - 负责操作模式。

我敢说这是一个问题,如果你投入时间并深入了解优秀的ZMQ概念和架构,那就更有意义了。

自ZMQ库的早期版本以来,有一些重要的参数,有助于中央杰作(IO线程)保持稳定可扩展的理由,从而为您提供这个强大的框架。

零共享/零复制/(几乎)零延迟是不能实现零成本的格言。

ZMQ.Context实例具有相当丰富的内部参数化,可以通过API方法进行修改。

让我引用一个奇妙而珍贵的资料--Pieter HINTJENS的书, Code Connected,第1卷

(绝对值得花时间和逐步完成PDF副本.C语言代码片段不会伤害任何人的pythonic心态,因为关键信息在Pieter已经制作成300多个令人兴奋的页面的文本和故事中)。

  

高水位赛

     

当您可以从一个过程快速地发送消息时,您很快就会发现内存是一种宝贵的资源,并且可以轻易填满。除非您了解问题并采取预防措施,否则在进程中的某个地方延迟几秒钟可能会变成导致服务器崩溃的积压。

     

...

     

ØMQ使用HWM(高水位线)的概念来定义其内部管道的容量。从套接字或套接字出来的每个连接都有自己的管道,HWM用于发送和/或接收,具体取决于套接字类型。某些套接字(PUBPUSH)只有发送缓冲区。有些(SUBPULLREQREP)只有接收缓冲区。一些(DEALERROUTERPAIR)同时具有发送和接收缓冲区。

     

在ØMQv2.x中,HWM默认为无限。这很容易,但对于大批量发布商来说通常也是致命的。在ØMQ v3.x中,默认情况下设置为1,000,这样更明智。如果您仍在使用ØMQv2.x,则应始终在套接字上设置HWM,为了匹配ØMQv3.x或其他数字,考虑到您的邮件大小和预期的用户表现。

     

当您的套接字到达其HWM时,它将阻止或丢弃数据,具体取决于套接字类型。如果数据到达PUBROUTERHWM套接字将丢弃数据,而其他套接字类型将阻止。在inproc传输中,发送方和接收方共享相同的缓冲区,因此实际HWM是双方设置的HWM的总和。

     

最后,HWM - s并不准确;虽然默认情况下最多可以获得1,000条消息,但由于libzmq实现其队列的方式,实际缓冲区大小可能会低得多(只有一半)。