ZeroMQ不会自动重新连接

问题描述 投票:5回答:2

我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。我已经编译了用C语言编写的hello-world clientREQ,connect,127.0.0.1)和serverREP,bind)。

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

    Q1:这是预期的行为吗?

我希望客户端should会在几秒钟内发现服务器再次运行,并且它将自动重新连接。

Q2:我应该在示例代码中进行哪些更改以解决此问题?

Q3:我使用的软件版本错误,或者系统上有问题吗?

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

strace -f ./hwclient输出中,我可以看到服务器关闭后,客户端正在每秒尝试10次connect()ZMQ_RECONNECT_IVL的默认值)。在strace -f ./hwserver输出上,我可以看到重新启动的服务器accept()建立了连接。但是,此后通信陷入僵局,服务器从不接收来自客户端的实际请求(但它会通知我何时杀死客户端;服务器还会从服务器重启后启动的其他客户端接收请求。)

使用ipc://代替tcp://会导致相同的行为。

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

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

我刚刚在Unbutu Precise(12.04)系统上下载并安装了zeromq-4.0.5。我已经编译了用C语言编写的hello-world客户端(REQ,connect,127.0.0.1)和服务器(REP,bind)。我启动...

c tcp zeromq reconnect
2个回答
3
投票

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


3
投票

A3:否

© www.soinside.com 2019 - 2024. All rights reserved.