多个客户端连接到单个ZMQ_PUSH
套接字。当客户端意外断电时,服务器不会收到警报,并继续向其发送消息。尽管使用了ZMQ_OBLOCK
并将ZMQ_HWM
设置为5(最多只能排队5条消息),但我的服务器直到重新连接客户端并立即接收到队列中的所有消息时才会出现错误。
发布于 2018-09-20 01:09:45
我最近在使用ZMQ时遇到了类似的问题。我们会切断互联系统的电源,用户将无法自动重新连接。事实证明,最近(过去一年左右)已经在ZMTP上实现了一种心跳机制,这是ZMQ套接字使用的底层协议。
如果您使用的是ZMQ4.2.0或更高版本,请查看ZMQ_HEARTBEAT_IVL和ZMQ_HEARTBEAT_TIMEOUT套接字选项(http://api.zeromq.org/4-2:zmq-setsockopt)的设置。它们将设置心跳(ZMQ_HEARTBEAT_IVL)之间的间隔以及关闭连接之前等待回复的时间(ZMQ_HEARTBEAT_TIMEOUT)。
编辑:您必须在连接前设置这些套接字选项。
发布于 2018-09-12 16:08:13
zmq中没有显式地检测到套接字另一端的程序意外终止,或者网络连接的意外故障。
历史上有传言说要在zmq中添加某种底层的乒乓球-你还活着的内部消息,但上次我看过(很久以前),它已经决定不这么做了。
这确实意味着崩溃、网络故障等不一定会被非常干净地处理,并且您的应用程序不一定知道发生了什么,或者消息是否已经成功发送。归根结底,它是Actor模型。当你发现你的程序最终可能会确定之前出了什么问题。zmtp中的超时将发现故障,并最终返回到您的程序中。
要想做得更好,你必须自己做一些像乒乓球这样的事情(例如,有一个单独的套接字,这样你就可以跟踪客户端的可达性),但是这就使得使用ZMQ的好部分变得非常困难,比如推/拉。这可能就是为什么(优秀的) zmq作者决定不把它放在自己身上的原因。
当遇到类似的问题时,我最终编写了自己的传输库。我找不到一个现成的在网络故障、崩溃等情况下表现良好的程序。它实现了CSP,而不是actor模型,速度不是很快(这是必然性),不是zmq意义上的模式,但确实意味着程序在任何时候都确切地知道消息在哪里,并且知道客户端在任何时候都是活动的或不可访问的。CSPness还意味着消息传输是执行集合点,所以程序也知道彼此在做什么。
https://stackoverflow.com/questions/52165377
复制相似问题