ZeroMQ不会自动重新连接
我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。 我编译了用C编写的hello-world 客户端 ( REQ
,connect,127.0.0.1)和服务器 ( REP
,bind)。
- 我启动服务器。
- 我启动了客户端。
- 客户端每秒向服务器发送一条消息,并接收响应。
- 我按Ctrl- C停止服务器。
- 客户端尝试发送其下一个传出消息,并且卡在永不返回的epoll系统调用中(如strace所示)。
- 我重新启动服务器。
- 即使新服务器已运行一分钟,客户端中的
zmq_recv
调用仍然卡住。 为客户端取得进展的唯一方法是将其终止(使用Ctrl- C )并重新启动它。
Q1:这是预期的行为吗? 我希望在几秒钟内客户端应该知道服务器再次运行,它会自动重新连接。
Q2:我应该在示例代码中更改哪些内容来解决此问题?
问题3:我使用的是错误版本的软件,还是我的系统坏了?
我已禁用防火墙, sudo iptables -S
prints -P INPUT ACCEPT
; -P FORWARD ACCEPT
; -P OUTPUT ACCEPT
。
在strace -f ./hwclient
输出中,我可以看到客户端在服务器关闭后每秒尝试connect()
10次(默认值为ZMQ_RECONNECT_IVL
)。 在strace -f ./hwserver
输出中,我可以看到重新启动的服务器accept()
的连接。 但是,之后通信会卡住,服务器永远不会收到来自客户端的实际请求(但是当我终止客户端时它会注意到;服务器也会收到服务器重启后启动的其他客户端的请求)。
使用ipc://
而不是tcp://
会导致相同的行为。
如果在客户端执行下一个zmq_send
之前服务器已被zmq_send
则在zmq_send
中成功发生自动重新连接。 但是,当服务器在客户端运行zmq_recv
时被杀死时, zmq_recv
无限期地阻塞,而客户端似乎无法从中恢复。
我发现这篇文章建议使用超时。 但是,我认为超时不是正确的解决方案,因为TCP断开通知已经在客户端进程中可用,并且它已经在它上面 – 它只是不会使zmq_recv
重新发送对新服务器的请求 – – 或者至少提前返回表示错误。
您可能遇到了zemomq在4.0.6(问题1362)中为我修复的相同问题。 基本上,用户套接字在重新连接期间不会总是重新发送它的filter(空filter意味着没有来自发布者的消息到该用户)。 恢复的唯一方法是重新启动客户端的应用程序。 他们的修复似乎完成了这项工作。 使用传输(如stunnel)隧道连接时,问题确实突出显示。 没有4.0.6,我能够通过在订阅者套接字上设置“立即”标志来解决问题。
A3:没有。
A2:不要期望demo有一个设计用于故障恢复操作
A1:是的。
哪里可以了解更多详情?
你可以为此做的最好的下一步是恕我直言,以获得更多的全局视图,这对于尝试使用ZeroMQ进行编码的前几个事情听起来可能很复杂,但如果你至少跳转到Code Connected的第265页 ,第1卷[ asPdf – >] ,如果不是那里一步一步阅读的情况。
有史以来最快的学习曲线是在图 60的 Republishing Updates和图62 HA Clone Server对上首先获得一个未公开的视图 ,以获得可能的高可用性方法,然后回到根,元素和细节。