4

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

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

如果上述解决方案都不起作用,我可能最好将我的套接字转换为 REP 套接字并逐个获取每条消息,每次都 ACK:ing 它们。由于这将是同步的,我想这会更慢。

4

2 回答 2

4

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

请参阅第四章 - zguide 的可靠请求 - 回复

于 2012-11-05T12:27:36.380 回答
1

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

  1. 将 pull socket 上的接收高水位线设置为我愿意保留在内存中的 msg 数量。
  2. 将缓冲区大小设置为适当的大小。
  3. 当我不再希望接收消息时,我在接收通道上调用 socket.disconnect()。

断开连接后,频道将不再收到新的消息。如果您在发送方设置高水位线,它将开始将消息保存在发送方队列中(这样事件就不会丢失)

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

于 2014-03-31T13:34:00.990 回答