关闭ZeroMQ接收端而不会丢失

时间:2012-11-05 10:11:32

标签: zeromq

我正在开发一个(Python / pyzmq))ZeroMQ服务器,它通过PULL套接字接收传入消息。

现在,有时我会重新启动服务器以升级它。我的问题是; 我可以以某种方式停止接收传入的消息(在我的PULL套接字上),以便重启不会丢失任何消息吗?我在考虑调用close()没有套接字,然后{{ 1}}最后一条消息。可能将高水位设置为零会产生类似的结果。

如果以上解决方案都不起作用,我可能最好将我的套接字转换为REP套接字并将每条消息一个接收,确认:每次都是这样。由于这将是同步的,我想这会更慢。

2 个答案:

答案 0 :(得分:4)

是的,0mq本身不会提供这种类型的可靠交付。您应该使用带有ACK的方案。

请参阅zguide的Chapter Four - Reliable Request-Reply

答案 1 :(得分:1)

我使用clrzmq和ZMQ 3.2.2并通过在PULL套接字上设置以下属性来获得上述功能:

  1. 将拉线插座上的接收高水印设置为我愿意留在内存中的消息数。
  2. 将缓冲区大小设置为适当的大小。
  3. 当我不再希望收到消息时,我在接收频道上调用socket.disconnect()。
  4. 断开连接后,频道将不再获得新的信息。如果您在发送方设置了高水位,它将开始将msgs保留在发送方队列中(这样事件就不会丢失)

    当通道断开时,在接收器队列中有msgs时,调用接收事件将成功。我使用超时接收,所以如果超时后失败,当通道断开时,我假设队列为空,我可以处理该通道并重启服务。 当服务备份时,将发送存储在发送方队列中的所有消息。