我有一个客户端/服务器设置,其中客户端向服务器发送单个请求消息并返回一堆数据消息。 服务器使用ROUTER套接字实现,客户端使用DEALER实现。通信是异步的。 客户端通常是iPad / iPhone,它们通过wifi连接,因此连接不是100%可靠。
我担心的问题是,如果客户端连接到服务器并发送数据请求,但在响应消息被传回之前,通信会中断(例如,无法覆盖wifi)。
在这种情况下,消息将在服务器端排队等待客户端重新连接。这很好,但最终我想删除消息和连接以释放资源。
通过检查活动/超时,可以在服务器和客户端应用程序中识别连接已消失。客户端可以关闭套接字并以这种方式释放资源但是如何在服务器中完成?
答案 0 :(得分:1)
如何刷新ZeroMQ套接字队列中的所有消息?
没有用于刷新特定消息或来自消息队列的所有消息的显式命令。您可以将ZMQ_LINGER设置为0并关闭套接字以丢弃任何未发送的消息。
每this mailing list discussion from 2013:
没有选项[从传出消息队列中删除旧消息]。
最好的办法是实现心跳,当一个客户端在没有明确断开连接的情况下停止响应时,重新启动ROUTER套接字。凌乱,我知道,这确实应该是HWM的配套选项。 Pieter Hintjens is clearly on board(他创建了ZMQ) - 但那是从2011年开始的,所以它看起来没有任何结果。
答案 1 :(得分:0)
这有点晚了但将tcp keepalive设置为合理的值会导致在超时超时后关闭死套接字。 心跳是必要的,任何一方都要确定对方仍在回应。 我唯一不确定的是如何在没有花费所有可用的CPU来处理心跳的情况下,为数千名客户提供心跳加速。