2012-11-05 23 views
3

我正在開發一個(Python/pyzmq))ZeroMQ服務器,它通過一個PULL套接字接收傳入消息。關閉ZeroMQ接收端無損

現在,有些時候我會重新啓動服務器來升級它。我的問題是; 我可以以某種方式停止接收傳入消息(在我的PULL套接字上),以便重新啓動不會丟失任何消息嗎?我正在考慮像打電話close()沒有插座,然後recv() ing最後的消息。可能將高水位設置爲零會產生類似的結果。

如果上述解決方案都不起作用,我可能會更好地將套接字轉換爲REP套接字,然後每次獲取每條消息,ACK:每次都收到它們。由於這將是同步的,我猜這會比較慢。

回答

1

我使用clrzmq與ZMQ 3.2.2,我得到了由PULL套接字上設置以下屬性,上述功能:

  1. 設定上拉插座上接收高水印封郵件的數量我願意留在記憶中。
  2. 將緩衝區大小設置爲適當的大小。
  3. 當我不再希望接收消息時,我在接收通道上調用socket.disconnect()。

斷開連接後,通道將不再獲取新的信息。如果您在發送方設置了高位水印,它將開始保留髮件人隊列中的消息(以便事件不會丟失)

當通道斷開連接時,在接收器中存在消息時調用接收事件將成功隊列。我使用超時接收,所以如果超時後失敗,當通道斷開連接時,我假設隊列爲空,我可以處理通道並重新啓動服務。 服務備份時,存儲在發件人隊列中的所有消息都將被分派。

4

是的,0mq不會提供這種類型的可靠交付本身。你肯定應該使用ACK方案。

參見zguide的Chapter Four - Reliable Request-Reply

+0

感謝您的回覆。有趣的是,發送者關閉時確保清空所有隊列,但在接收端不存在類似的東西... – Ztyx