如何在ZMQ中删除不活跃/断开连接的节点

6
我有一个客户端/服务器设置,客户端向服务器发送单个请求消息并获得一堆数据消息。服务器使用ROUTER套接字实现,客户端使用DEALER套接字。通信是异步的。客户端通常是iPad/iPhone,并通过wifi连接,所以连接不是100%可靠。 我关心的问题是如果客户端连接到服务器并发送请求以获取数据,但在响应消息返回之前通信中断(例如,WiFi覆盖范围外),则消息将在服务器端排队等待客户端重新连接。对于短时间来说这没问题,但最终我想要丢弃这些消息并释放资源。通过检查活动/超时,可以在服务器和客户端应用程序中识别连接已失去。客户端可以关闭套接字,从而释放资源,但如何在服务器端执行呢?
2个回答

1

根据ZMQ FAQ

如何清空ZeroMQ套接字队列中的所有消息?

没有专门的命令来清空特定消息或所有消息。您可以将ZMQ_LINGER设置为0并关闭套接字以丢弃任何未发送的消息。

根据2013年的邮件列表讨论

没有选项可以删除[出站消息队列]中的旧消息。

你最好的选择是实现心跳机制,当一个客户端停止响应而没有显式断开连接时,重新启动你的 ROUTER 套接字。虽然有点麻烦,但这确实应该有一个与 HWM 相关的伴随选项。Pieter Hintjens 明显支持(他创建了 ZMQ)- 但这是在2011年,所以看起来什么也没发生。

有点乱糟糟的,没错。那是我对这种情况的独立解释。我可能会考虑定期关闭套接字。感谢回答。 - Carl Larsson
不客气!如果这个答案(虽然可能不太令人满意)对您足够有用,请考虑将其标记为已接受和/或点赞,以便其他用户知道您的问题已得到处理。 - Jason
如果最新版本的zeromq中,如果dealer没有显式断开连接(机器重启),那么路由器必须重新启动套接字,这是否仍然是相同的情况?目前,dealer会发送心跳信号,当它过期时,它会重新创建套接字。但是在路由器中,它只存储dealer身份列表,并在心跳信号过期时将其删除。我看到的问题是,当PC重新启动带有dealer套接字的时候,当它启动时,dealer无法连接到路由器。只有在路由器应用程序重新启动时才能连接到路由器。 - Paul

1
这可能有点晚了,但将TCP keepalive设置为合理的值会导致超时后死掉的套接字关闭。 心跳是必要的,以便任何一方确定另一方仍在响应。 我唯一不确定的是如何进行心跳以处理数千个客户端而不会耗尽所有可用的CPU资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接