由于似乎无法查询/检查底层的ZeroMQ队列/缓冲区套接字以查看它们的利用率,因此有一些方法可以检测在发送/排队时由于Publisher套接字中的完整缓冲区而丢弃邮件的时间?
例如,如果发布者队列已满,则zmq_send操作将简单地删除该消息.
基本上,我想要实现的是一种检测队列变得紧张和/或完全能够(稍后)调整解决方案以更好地工作的情况的方法.另一种方法是为每条消息添加一个序列号,并在订阅者中进行简单的计算,但我永远无法确定由于发布者中的完整缓冲区而导致消息丢失.
ZeroMQ指南中有一个例子(如果你想快乐地使用0MQ,你应该阅读并消化):http://zguide.zeromq.org/page:all # Slows-Subscriber -Detection-Suicidal- Snail-图案
当您自己回答时,该机制是在消息中添加序列号,并允许订户检测间隙并采取适当的措施.对于大多数pubsub场景,您可以将默认HWM(1,000)提高到更高的值; 这取决于您的平均邮件大小.
小智 5
我知道这是一篇旧帖子,但这是我最近遇到同样问题时所做的。
我选择使用 aDEALER/ROUTER并将ZMQ_SNDHWM选项设置为 1。我还提供了每个zmq_send(). 超时可以是 10 毫秒到 3 秒之间的任何值,具体取决于您的场景是什么(本地或远程发送)。
如果消息未在超时内发送或发送缓冲区已满,zmq_send()则将返回 false。这使我能够在 zmq 前面设置一个重试队列。我知道这不是一个完美的解决方案,但对我来说它工作得很好。不过让我感到困惑的是DEALER-socket返回的 true/false 的含义zmq_send()。我一直无法找到这个问题的答案。它是否表明消息已被缓冲或消息已传递给ROUTER我已经避开了。就我而言,无论如何我都得到了所需的结果。
只是为了记录,这是使用 netmq 完成的,但我想它也适用于 ZeroMQ。
不过我确实同意詹姆斯。ZeroMQ(和 netmq)至少应该提供一种检查队列(并取出消息)的方法,以及一种告诉各种套接字不要丢弃消息的方法。最好的选择是根据配置的选项将未及时传递的消息发送到某种死信队列。然后可以单独处理死信队列。