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

nic*_*ine 4 python zeromq pyzmq

我正在从DEALER一个ROUTER使用发送20000条消息pyzmq.

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

是什么导致了这个问题?

use*_*197 6

是什么导致了这个问题?

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

如果你投入时间并深入了解优秀的ZMQ概念和架构,我敢于称之为问题.

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

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

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

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

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

高水位标志

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

...

ØMQ使用HWM(高水位线)概念来定义其内部管道的容量.从套接字或套接字出来的每个连接都有自己的管道,HWM用于发送和/或接收,具体取决于套接字类型.某些套接字(PUB,PUSH)只有发送缓冲区.有些(SUB,PULL,REQ,REP)只有接收缓冲区.有些(DEALER,ROUTER,PAIR)必须同时发送和接收缓冲区.

在ØMQv2.x中,HWM默认为无限.这很容易,但对于大批量发布商来说通常也是致命的.在ØMQv3.x中,默认设置为1,000,这更为明智.如果您仍在使用ØMQv2.x,则应始终设置HWM套接字,为1,000以匹配ØMQv3.x或另一个考虑到您的消息大小和预期用户性能的数字.

当您的套接字到达其HWM时,它将阻止或丢弃数据,具体取决于套接字类型.PUBROUTER如果他们达到他们的插座会丢弃数据HWM,而其它的套接字类型将发生阻塞.在inproc传输过程中,发送方和接收方共享相同的缓冲区,因此实际值HWMHWM双方设置的总和.

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