如何在ZeroMQ PUB-SUB模式中发送时检查消息是否由于HWM而丢失

问题描述 投票:3回答:2

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

我的问题是,我如何知道发布者缓冲区已满时发送丢弃了消息?

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

我怎么知道什么时候消息被丢弃?如果这是预期的行为,而ZeroMQ不让我们知道,那么如何找到我的发送是否丢弃了消息的解决方法?

linux ipc zeromq
2个回答
1
投票

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

如果您只是想知道何时删除消息,就像在消息中添加递增的消息号并让订户监视该消息一样简单。您可以选择将此数字放置在自己的框架中;整体的简单性将是决定因素。我认为无法确定何时删除消息,特别是因为已达到HWM。


1
投票

默认情况下,最新版本的默认zeromq pub / sub默认为包含1000条消息的高水位标记ZMQ_SNDHWM / ZMQ_RCVHWM

这是如果您在一个紧密循环中爆发超过1000条消息,则可能会丢弃一些消息。编写测试并为每个消息提供带有序列号的有效负载很简单。

一个选项是将两个HWM都设置为0。这意味着它是无限的。

您可以使用我最近写的一些示例来解决这个问题:

https://gist.github.com/easytiger/992b3a29eb5c8545d289https://gist.github.com/easytiger/e382502badab49856357

将在一连串消息中发布和订阅tport。如果您使用HWM,您会发现,如果不为0,它将掉落很多]]

© www.soinside.com 2019 - 2024. All rights reserved.