10

Since it does not seem to be possible to query/inspect the underlying ZeroMQ queues/buffers sockets to see how much they are utilized, is there some way to detect when a message is dropped due to full buffers in a Publisher socket when sent/queued?

For example, if the publisher queue is full, the zmq_send operation will simply drop the message.

Basically, what I want to achieve is a way to detect situations where the queues are getting stressed and/or full to be able to (later on) tune the solution to work better. One alternative way would be to add a sequence number to each message and do a simple calculation in the subscriber but I can never be sure that a message was lost due to full buffers in the publisher.

4

2 回答 2

9

ZeroMQ 指南中有一个例子(如果你想愉快地使用 0MQ,你应该阅读和消化):http: //zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal- Snail-图案

该机制就像您自己回答的那样,在消息中添加一个序列号,并允许订阅者检测间隙并采取适当的措施。对于大多数 pubsub 场景,您可以将默认 HWM(即 1,000)提高到更高的值;这取决于您的平均邮件大小。

于 2012-12-15T13:47:24.233 回答
5

我知道这是一篇旧帖子,但这是我最近遇到同样问题时所做的。

我选择使用 aDEALER/ROUTER并将ZMQ_SNDHWM选项设置为 1。我还在每个zmq_send(). 超时可能在 10 毫秒到 3 秒之间,具体取决于您的场景(本地或远程发送)。

如果消息未在超时内发送或发送缓冲区已满,zmq_send()则将返回 false。这使我能够在 zmq 前面设置一个重试队列。我知道这不是一个完美的解决方案,但对我来说它工作得很好。令我困惑的是DEALER-socket返回的真/假的含义zmq_send()。我一直无法找到那个问题的答案。它是否表明消息已被缓冲或消息已被传递给我,这ROUTER让我感到困惑。就我而言,无论如何我都得到了所需的结果。

只是为了记录,这是使用 netmq 完成的,但我想它也适用于 ZeroMQ。

不过我同意詹姆斯的观点。ZeroMQ (和 netmq )至少应该提供一种检查队列(并获取消息)的方法,以及一种告诉各种套接字不要丢弃消息的方法。最好的选择是根据配置的选项将未及时传递的消息发送到某种死信队列。然后可以单独处理死信队列。

于 2017-07-26T08:56:31.043 回答