ZeroMQ不会自动重新连接

pts*_*pts 5 c tcp reconnect zeromq

我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5.我编译了用C编写的hello-world 客户端(REQ,connect,127.0.0.1)和server(REP,bind).

  1. 我启动服务器.
  2. 我启动了客户端.
  3. 客户端每秒向服务器发送一条消息,并接收响应.
  4. 我按Ctrl- C停止服务器.
  5. 客户端尝试发送其下一个传出消息,并且它被卡在一个永不返回的epoll系统调用中(如strace所示).
  6. 我重新启动服务器.
  7. zmq_recv即使新服务器已运行一分钟,客户端中的呼叫仍然卡住.为客户端取得进展的唯一方法是将其终止(使用Ctrl- C)并重新启动它.

Q1:这是预期的行为吗?我希望在几秒钟内客户端应该 知道服务器再次运行,它会自动重新连接.

Q2:我应该在示例代码中更改什么才能解决此问题?

问题3:我使用的是错误的软件版本,还是我的系统坏了?

我已禁用防火墙,sudo iptables -S打印-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_recv,然后zmq_recv无限期地阻塞,并且客户端似乎无法从中恢复.

我发现这篇文章建议使用超时.但是,我认为超时不是正确的解决方案,因为TCP断开通知已经在客户端进程中可用,并且它已经在它上面作用 - 它只是不会zmq_recv将请求重新发送到新服务器 -或者至少提前返回表示错误.

小智 4

您可能遇到与 Zeromq 在 4.0.6 中为我修复的相同问题(问题 1362)。基本上,订阅者套接字在重新连接期间并不总是重新发送其过滤器(空过滤器意味着没有从发布者到该订阅者的消息)。恢复的唯一方法是重新启动客户端的应用程序。他们的修复似乎已经完成了工作。当使用传输(如隧道)来建立连接隧道时,这个问题确实突出了。如果没有 4.0.6,我可以通过在订阅者套接字上设置“立即”标志来解决这个问题。