什么是RabbitMQ的“x-expires”论证的ZeroMQ eqivillent?

时间:2012-04-12 22:01:53

标签: rabbitmq zeromq amqp

...或者zmq如何处理断开连接的客户端?队列是否存在某种超时,如果客户端断开连接,它可以继续接收消息,但在这么多秒后自行清理?

2 个答案:

答案 0 :(得分:2)

请参阅:http://api.zeromq.org/2-1:zmq-setsockopt

ZMQ插座具有高水印的概念。

来自文档:

The high water mark is a hard limit on the maximum number of outstanding messages ØMQ shall 
queue in memory for any single peer that the specified socket is communicating with.

If this limit has been reached the socket shall enter an exceptional state and depending on 
the socket type, ØMQ shall take appropriate action such as blocking or dropping sent messages. 

对于每种类型的zmq套接字(REQ,REP,PUB,SUB等),您可以检查文档的行为 - 如果它阻止发送消息或丢弃它们。

主要是当客户端断开连接时,它会丢弃消息。如果这对您很重要,则必须在ZMQ模式之上构建消息持久性和可靠性。

答案 1 :(得分:1)

您可以使用几种不同的策略,这取决于您的需求(没有一个答案适合所有人)。

通常,如果客户端断开连接,则将删除其在服务器端的队列。 PUB到SUB流以及PUSH到PULL流都是如此。

如果您想要频繁断开连接,可以使用ROUTER-DEALER并在连接上设置标识(在连接前,在DEALER侧)。然后ROUTER将为DEALER排队消息,即使它消失并返回。然后,您可以使用HWM限制该队列的大小。

如果你想要超时,那就更棘手了,因为ZeroMQ要么永久保留消息,要么在无法排队时立即丢弃它们。您需要在服务器中自己的列表结构中对消息进行排队,将HWM设置为1,并使用非阻塞发送将它们从队列中推出,因为它们有空间。然后,您可以自己使客户端到期并删除与其关联的队列。这听起来很有效但很简单。