linux - 如何在 ZeroMQ PUB-SUB 模式中检查消息是否由于 HWM 而被丢弃

标签 linux ipc zeromq

我在 Linux 中使用 ZeroMQ(更具体地说是 CZMQ)为 IPC 实现了一个消息总线。 Here是我已经实现的。

我的问题是,我怎么知道 send 在发布者缓冲区已满时丢弃了消息?

在我的简单测试设置中,我使用了带有代理的发布者-订阅者。我有一个快速的发送者和一个非常慢的接收者,导致消息到达 HWM 并在发送时掉线。我的异常(exception)是发送会因“消息丢失”错误而失败,但事实并非如此。即使消息被丢弃,zmq_msg_send() 也没有给我任何错误(我可以通过查看订阅者端的消息间隙来验证这一点)。

我怎么知道消息何时被丢弃?如果这是预期的行为并且 ZeroMQ 没有让我们知道,如果我的发送丢失了消息,有什么解决方法可以找到?

最佳答案

您似乎要求的是 PUB/SUB 不理想的容错能力。不仅可能达到 HWM,而且考虑如果订阅客户端死机并重新启动会发生什么情况 - 它会在持续时间内错过发布者发送的消息。 FWIW。在 ZMQ v2 中,PUB/SUB 的默认 HWM 是无限的,但在 v3 中更改为 1000,因为系统由于消息排队速度快于发送速度而导致内存阻塞。当平均消息速率在网络带宽范围内时,1000 似乎是消息突发的合理值。 YMMV.

如果您只想知道消息何时被丢弃,只需向消息添加一个递增的消息编号并让订阅者对其进行监控即可。您可以选择是否将此数字放在它自己的框架中;整体简单性将是决定因素。我认为无法确定消息何时被丢弃,因为已达到 HWM。

关于linux - 如何在 ZeroMQ PUB-SUB 模式中检查消息是否由于 HWM 而被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840785/

相关文章:

python - 是否可以使用未安装到 linux python 目录中的 python 模块?

python - Python 中的 System V 共享内存?

python - 无法使用 NetMQ 在 Unity3d 和 Python 之间发送消息

python - 我想关闭并且不关闭交换机的端口

linux - 如何在 Linux shell 脚本中更改文件扩展名?

linux - 剪切匹配并放在另一个位置

c# - .NET 应用程序如何重定向其自己的标准输入流?

c - child 和 parent 之间使用信号的双向交流

python - PyZMQ req 套接字 - 卡在 context.term() 上

python - pyzmq - undefined symbol : zmq_msg_gets