2012-04-12 58 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,並使用非阻塞發送將它們從隊列中推出,因爲它們有空間。然後,您可以自己過期客戶並刪除與其關聯的隊列。這聽起來像工作,但很簡單。