【问题标题】:ZeroMQ doesn't auto-reconnectZeroMQ 不会自动重新连接
【发布时间】:2014-12-20 20:32:36
【问题描述】:

我刚刚在 Unbutu Precise (12.04) 系统上下载并安装了 zeromq-4.0.5。我已经编译了用 C 编写的 hello-world client (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:我应该在示例代码中更改什么来解决这个问题?

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

我已禁用防火墙,sudo iptables -S 打印 -P INPUT ACCEPT-P FORWARD ACCEPT; -P OUTPUT ACCEPT.

strace -f ./hwclient 输出中,我可以看到客户端在服务器关闭后每秒尝试connect() 10 次(默认值ZMQ_RECONNECT_IVL)。在strace -f ./hwserver 输出上,我可以看到重新启动的服务器accept()s 连接。然而,在那之后通信就卡住了,服务器永远不会收到来自客户端的实际请求(但是当我杀死客户端时它会注意到;服务器也会收到来自服务器重启后已启动的其他客户端的请求)。

使用ipc:// 而不是tcp:// 会导致相同的行为。

如果在客户端执行下一个zmq_send 之前服务器已被终止,则自动重新连接在zmq_send 中成功发生。但是,当服务器在客户端运行 zmq_recv 时被杀死,zmq_recv 会无限期阻塞,客户端似乎无法从中恢复。

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

【问题讨论】:

  • 检查 zmq_setsockoptzmq_getsockopt 可能会有所帮助,有一些重新连接的选项。
  • @raison:看起来zmq_setsockopt (api.zeromq.org/4-0:zmq-setsockopt) 中ZMQ_RECONNECT_IVL 的默认值启用了自动重新连接。我还应该改变什么?
  • ZeroMQ 建议将所有代码设计成能够优雅地退出并释放所有资源SIG_KILL 不会给 .close() 所有 ZMQ-Sockets 和 .term() 所有与进程相关的 ZMQ-Context 线程提供太多机会( s),如果不小心处理,历史上会导致严重的内存泄漏和 O/S 僵尸阻塞端口以及许多生产级环境问题。
  • 仅供参考,我刚刚注意到这个关于可靠 REQ-REP 的非常长的章节:zguide.zeromq.org/page:all#reliable-request-reply

标签: c tcp zeromq reconnect


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    A3:没有。

    A2:不要期望演示具有容错操作的设计

    A1:是的。


    去哪里了解更多详情?

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

    有史以来最快的学习曲线将是首先在 图 60 上有一个未公开的视图 重新发布更新和 图 62 HA 克隆服务器对 用于可能的高可用性方法,然后返回到根源、元素和细节。

    【讨论】:

      【解决方案3】:

      REQ/REP通信解决方案

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-28
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        相关资源
        最近更新 更多