2

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

4

2 回答 2

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 模式之上构建消息持久性和可靠性。

于 2012-06-20T23:45:01.583 回答
1

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

一般来说,如果客户端断开连接,它在服务器端的队列会被删除。PUB 到 SUB 流和 PUSH 到 PULL 流都是如此。

如果您想处理频繁的断开连接,您可以使用 ROUTER-DEALER 并在连接上设置一个身份(在 DEALER 端,在连接之前)。然后 ROUTER 将为 DEALER 排队消息,即使它离开并回来。然后,您可以使用 HWM 限制该队列的大小。

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

于 2012-11-10T05:28:48.343 回答