【问题标题】:How to drop inactive/disconnected peers in ZMQ如何在 ZMQ 中删除不活动/断开连接的对等点
【发布时间】:2015-02-17 09:11:20
【问题描述】:

我有一个客户端/服务器设置,其中客户端向服务器发送一条请求消息并返回一堆数据消息。 服务器使用 ROUTER 套接字实现,客户端使用 DEALER。通信是异步的。 客户端通常是 iPad/iPhone,它们通过 wifi 连接,因此连接不是 100% 可靠的。

我担心的问题是,如果客户端连接到服务器并发送数据请求,但在返回响应消息之前通信中断(例如,超出 wifi 覆盖范围)。

在这种情况下,消息将在服务器端排队等待客户端重新连接。这在短时间内很好,但最终我想删除消息和连接以释放资源。

通过检查活动/超时,服务器和客户端应用程序可以识别连接已断开。客户端可以关闭套接字并以这种方式释放资源,但是如何在服务器中完成呢?

【问题讨论】:

    标签: zeromq disconnect peer


    【解决方案1】:

    the ZMQ FAQ:

    如何刷新 ZeroMQ 套接字队列中的所有消息?

    没有用于从消息队列中刷新特定消息或所有消息的显式命令。您可以将 ZMQ_LINGER 设置为 0 并关闭套接字以丢弃任何未发送的消息。

    this mailing list discussion from 2013

    没有[从传出消息队列]丢弃旧消息的选项。

    最好的办法是实现心跳,当一个客户端停止响应而没有明确断开连接时,重新启动您的 ROUTER 套接字。凌乱,我知道,这确实是应该与 HWM 配套选择的东西。 Pieter Hintjens is clearly on board(他创建了 ZMQ)——但那是从 2011 年开始的,所以看起来什么都没发生。

    【讨论】:

    • 确实有点乱。这也是我对这种情况的解释。我可能会考虑定期关闭套接字。感谢您的回答。
    • 不客气!如果这个答案(尽管可能不太令人满意)对您来说已经足够了,请考虑将其标记为已接受和/或投票,以便其他用户知道您的查询已得到处理。
    • 如果经销商没有明确断开(机器重启),路由器必须重启套接字,最新版本的zeromq是否仍然相同?目前,经销商心跳,当它到期时,它会重新创建套接字。但在路由器中,它只存储经销商身份列表,并在心跳到期时将其删除。我看到的问题是当PC使用经销商插​​座重新启动时,当它启动时,经销商无法连接到路由器。仅当路由器应用程序重新启动时才连接到路由器。
    【解决方案2】:

    这有点晚了,但是将 tcp keepalive 设置为合理的值会导致死套接字在超时到期后关闭。 任何一方都需要心跳来确定另一方仍在响应。 我唯一不确定的是如何在不花费所有可用 CPU 处理心跳的情况下为成千上万的客户提供心跳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多