2012-04-12 61 views

回答

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

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

一般情况下,如果客户端断开连接,服务器端的队列将被删除。这对PUB到SUB流程是正确的,并且PUSH到PULL流程是正确的。

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

如果你想要超时,它会更复杂一些,因为ZeroMQ会永远保留消息,或者如果它们不能排队,就会立即丢弃消息。您需要将消息排列在服务器的自己的列表结构中,将HWM设置为1,并使用非阻塞发送将它们从队列中推出,因为它们有空间。然后,您可以自己过期客户并删除与其关联的队列。这听起来像工作,但很简单。