13

我有一个应用程序在 epgm PUB 套接字上向一个或多个 epgm SUB 套接字发送消息。事情大部分都有效,但如果订阅应用程序的时间足够长,它通常最终会丢失一条消息或几条消息。(我的消息有序列号,所以我可以判断是否有任何丢失或乱序。)根据我对 ZMQ 文档的阅读,我认为 epgm 的“可靠多播”性质会阻止这种情况发生,即在 SUB 套接字收到一条消息后,可以保证一直收到它们,直到关闭或出现重大网络故障(即连接被最大化)。

无论如何,这就是上下文,但问题只是标题:ZMQ 通过 epgm 为 PUB/SUB 提供哪些可靠性保证(如果有)?

4

2 回答 2

10

ZeroMQ 中的 PGM 实现使用内存中的窗口进行恢复,因此只是短暂的。如果由于窗口耗尽而导致恢复失败:例如发布速度比恢复转换所需的速度快,则底层 PGM 套接字将重置并尽最大努力继续。

这意味着在高数据速率或大量数据包丢失时,传输将不断重置,您将丢弃无法恢复的消息:因此无法保证可靠传递。

PGM 配置的目标是实时广播,这样慢速接收器就不会停止发送器。该协议确实支持这两种范式,但由于缺乏需求,后者尚未实施。

于 2013-04-04T20:25:02.480 回答
6

ZeroMQ 只做了一个保证:所有消息都是完整的——你永远不会收到部分消息。它不保证可靠性。您应该查看高水位线 (HWM) 行为的文档,这是导致消息丢失的最常见原因,如suicidal snail所示。

于 2013-04-04T18:59:32.667 回答