【问题标题】:ZeroMQ Pub/Sub on Unreliable Connection不可靠连接上的 ZeroMQ Pub/Sub
【发布时间】:2014-11-24 14:51:07
【问题描述】:

我已经使用 zmq 4.0.4 实现了一个简单的 ZeroMQ Pub/Sub 架构。一切正常,sub 接收来自 pub 的消息。

一切都很好,我很高兴喝了很多啤酒。

但是 .. 让 sub 和 pub 通过不可靠的网络连接闲置 24 小时后,sub 无法从 pub 接收任何消息。在与 pub 连接后,我可以通过暂时阻止 sub 与 pub 的连接端口来重现该问题。 sub 不仅在防火墙后丢失了所有消息(预计由于 pub/sub 的性质),而且此后它也未能从 pub 接收任何消息。

发布了一个类似的(但旧的)问题,实际上在发生这种情况时让 sub 抛出异常。但似乎是一个已修复的错误。 ZMQ Pub-Sub Program Failure When Losing Network Connectivity

没有实现心跳来确定连接是否被切断,当与 pub 的连接被切断时,有没有办法让 sub 自动重新连接?

【问题讨论】:

  • 如果它不是自动重新连接,那么您唯一的其他选择就是心跳。重新连接应该是 ZMQ 套接字的“魔法”的一部分,如果它没有发生,那么某处就会掉下来。
  • 实现了心跳,它就像一个魅力..但是我很惊讶 ZMQ 在无法重新连接时不会抛出错误(或事件)
  • ZMQ 在很大程度上是一个用于构建通信系统的工具集,而不是一个完整的通信系统本身,所以毫无疑问,这被视为开发人员而不是库的责任......但是,这是一个相当开放的社区,所以如果有人想将此功能添加到库中,它可能会在那里:)

标签: zeromq


【解决方案1】:

zmq core github page 上发布了一个问题,并得到了项目所有者的回答。

PUB 套接字可能会看到错误,而 SUB 套接字会看到 不是。

ZMTP RFC 有一个关于心跳的提议,可以解决这个问题。 当前最好的解决方案是让 PUB 套接字发送心跳(例如 1 个 第二)当流量低时,以及 SUB 套接字断开/重新连接 如果他们停止获得这些。

实现了一个简单的心跳,它就像一个魅力。

More Info Here

【讨论】:

  • 我知道它来晚了,但你介意摆出一个心跳代码的 sn-p 吗?漂亮吗?
  • 确定!它实际上在我遇到此问题时编写的库中。 github.com/moappi/zeromq.process 。如果您希望使用 ZeroMQ 处理某些内容,请查看心跳部分或随意使用该库
【解决方案2】:

你可以使用这个小作弊,只需将它放在一个计时器上,每 60 秒发送一次,或者从你的 SUB 端发送什么。

std::string ping = "PING";
controller->setsockopt(ZMQ_SUBSCRIBE, ping.c_str(), ping.length());

这将具有保持 TCP 连接活动的效果,并返回任何导致 ZeroMQ 自动重新连接的 TCP 断开连接。

【讨论】:

  • 这可能有效,但即使订阅相同,订阅也会累积。您必须为每个订阅设置取消订阅。可能很难确保活跃订阅的数量始终 >0 同时也不是线性增长。
猜你喜欢
  • 2016-06-25
  • 2011-11-20
  • 2012-11-24
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 2015-04-21
相关资源
最近更新 更多