ZeroMQ不会自动重新连接

时间:2014-10-24 22:59:35

标签: c tcp zeromq reconnect

我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。我已经编译了问候世界client REQ ,connect,127.0.0.1)和server REP ,bind)用C语言编写。

  1. 我启动服务器。
  2. 我启动客户。
  3. 客户端每秒向服务器发送一条消息,并收到响应。
  4. 我按Ctrl- C 来停止服务器。
  5. 客户端尝试发送下一个外发消息,并且卡在永不返回的 epoll 系统调用中(如 strace 所示)。
  6. 我重新启动服务器。
  7. 即使新服务器已运行一分钟,客户端中的zmq_recv呼叫仍然卡住。为客户取得进展的唯一方法是将其终止(使用Ctrl- C )并重新启动它。
  8. 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无限期阻塞,客户端似乎无法从中恢复。

    我找到this article,建议使用超时。但是,我认为超时不是正确的解决方案,因为TCP断开连接通知已经在客户端进程中可用,并且它已经在它上面作用 - 它只是没有做出{ {1}}将请求重新发送到新服务器 - 或至少提前返回指示错误。

3 个答案:

答案 0 :(得分:3)

A3:否。

A2:不要期望演示具有故障恢复操作的设计

A1:是的。


去哪里了解更多详情?

你可以为此做的最好的下一步是恕我直言以获得更多的全局视图,对于尝试使用ZeroMQ进行编码的前几件事情可能听起来很复杂,但如果你至少跳转到Code Connected, Volume 1 [asPdf->]第265页,如果不是那里一步一步阅读的话。

最快的学习曲线将是图60 重新发布更新 <和<<>首先显示未公开的视图 strong>图62 HA克隆服务器对可能的高可用性方法,然后回到根,元素和细节。 enter image description here

答案 1 :(得分:3)

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

答案 2 :(得分:1)

REQ / REP通信解决方案

ZMQ_REQ_CORRELATE设置为1,并将ZMQ_REQ_RELAXED也设置为1。肯定会有所帮助。 使用ZMQ version 4.2 and higher进行这些设置。

以下是解决方案作者页面: improving-req-sockets-in-zqm-4

阅读手册中的更多内容: http://api.zeromq.org/4-2:zmq-setsockopt