ZMQ-客户端服务器:客户端意外关闭,服务器如何检测到它?

时间:2018-09-04 11:33:44

标签: c++ client-server zeromq

多个客户端连接到单个ZMQ_PUSH套接字。当客户端意外关闭电源时,服务器不会收到警报,并继续向其发送消息。尽管使用了ZMQ_OBLOCK并将ZMQ_HWM设置为5(最多只能排队5条消息),但是直到重新连接客户端并且一次接收到队列中的所有消息,我的服务器才会收到错误消息。

2 个答案:

答案 0 :(得分:2)

我最近在使用ZMQ时遇到了类似的问题。我们将切断互连系统的电源,并且订户将无法自动重新连接。事实证明,最近(过去一年左右)已经在ZMTP(ZMQ套接字使用的基础协议)上实现了心跳机制。

如果您使用的是ZMQ 4.2.0或更高版本,请考虑设置ZMQ_HEARTBEAT_IVL和ZMQ_HEARTBEAT_TIMEOUT套接字选项(http://api.zeromq.org/4-2:zmq-setsockopt)。这些将设置心跳之间的间隔(ZMQ_HEARTBEAT_IVL)以及等待答复直到关闭连接的时间(ZMQ_HEARTBEAT_TIMEOUT)。

编辑:必须在连接之前设置这些套接字选项。

答案 1 :(得分:1)

zmq中没有任何内容可以显式检测套接字另一端程序的意外终止或网络连接的意外意外失败。

一直以来都有关于在zmq中添加某种潜在的乒乓球“您仍在运行”内部消息的讨论,但是上次(很早以前)我决定不这样做。

这确实意味着崩溃,网络故障等不一定会非常干净地处理,并且您的应用程序不一定会知道正在发生什么或消息是否已成功发送。毕竟是演员模型。当您找到程序时,最终可能会确定以前出错了。 zmtp中的超时将发现失败,并最终导致后果回滚到您的程序。

要想做得更好,您必须在自己的上面放一个类似乒乓球的东西(例如,为此专门准备一个单独的插座,以便您可以跟踪客户端的可达性),但是这开始变得很难使用ZMQ的漂亮部分,例如推/拉。这也许就是为什么(优秀的)zmq作者决定不亲自使用它的原因。

遇到类似问题时,我最终编写了自己的传输库。面对网络故障,崩溃等情况,我找不到一个可以提供良好性能的现成产品。它实现了CSP,而不是actor模型,运行得并不快(不可避免),没有在zmq中执行模式有道理,但确实意味着程序始终准确知道消息的位置,并且知道客户端始终存在或无法访问。 CSPness还意味着消息传输是执行的集合点,因此程序也知道彼此在做什么。

相关问题