如何在 ZeroMQ 中以定义的速率发送消息?

How to send out messages with a defined rate in ZeroMQ?

我想测试我可以连接到发布者的订阅者数量,该发布者发送消息的速度很快,但不是最大速度,例如每微秒。

原因是,如果我以最大速度发送消息,我会错过接收方的消息(高水位线)。

我想,我可以使用 nanosleep(),并且每秒 20 条消息时效果很好 ( sleep: 50000000 [ns] )。但是随着休眠时间的缩短,情况变得更糟:195(5000000)、1700(500000)、16000(50000)条消息。睡眠时间更短,我真的收不到更多信息。似乎睡眠功能本身需要一些时间,如果我打印出时间戳,我可以看到这一点。

因此,我认为 运行 具有特定速率的函数是错误的方法。但是我没有找到用其他方式做到这一点的方法。

是否有可能每秒发送大约 1000000 条消息?

问:如何以定义的速率发送消息?

鉴于 API 是 v.4.2.3+,可以为此目的使用 { pgm:// | epgm:// }-transport class 并且设置充分调整的 .setsockopt( ZMQ_RATE, <kbps> ) 并展示一些与缓冲区大小调整相关的额外性能(ZMQ_SNDBUFZMQ_IMMEDIATEZMQ_AFFINITYZMQ_TOSZMQ_MULTICAST_MAXTPDU ) 以及一些优先级映射 e.t.c.,以便根据需要安全地接近硬件限制。


问:是否有可能每秒发送大约 1,000,000 条消息?

嗯,考虑到每条消息到线路的调度延迟不超过 1000 [ns],需要进行仔细的工程设计。

这种速率的最佳选择是使用 inproc:// 传输 class,因为它不依赖于 ZeroMQ 的 Context -instance IO-thread(s) performance / bottlenecks inside an external O/S scheduler(并且肯定会比任何其他类型的可用 transport-classes 更快地工作)。不过,这取决于它是否可以满足小于所需的 1000 [ns] 延迟,具体取决于您的应用程序设计和消息大小(零复制是我们的朋友,可以更好地满足延迟期限)。