【问题标题】:Shut down ZeroMQ receiving end without loss关闭 ZeroMQ 接收端不丢失
【发布时间】:2012-11-05 10:11:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: zeromq


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。有趣的是,虽然发送方关闭确保清空所有队列,但接收端不存在类似的东西......
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      相关资源
      最近更新 更多