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