关于不可靠连接的ZeroMQ Pub / Sub

时间:2014-09-30 04:49:43

标签: zeromq

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

一切都很棒,我为很多啤酒而欢欣鼓舞。

然而......在保持sub&酒吧闲置在不可靠的网络连接上,该子网无法接收来自酒吧的任何消息。我能够通过在与pub连接后临时阻止sub与pub的连接端口来重现该问题。子站点不仅在防火墙后面的时间内丢失所有消息(由于pub / sub的性质而预期),但是在此之后它还没有收到来自pub的任何消息。

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

如果没有实施心跳以确定连接是否被切断,那么当用酒吧切断连接时,子网是否有任何方法可以自动重新连接?

2 个答案:

答案 0 :(得分:4)

zmq core github page上发布了一个问题,项目所有者已经回答了问题。

  

在SUB套接字执行时,PUB套接字可能会看到错误   不

     

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

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

More Info Here

答案 1 :(得分:0)

你可以使用这个小作弊,只需将它放在一个定时器上,每隔60秒发送一次,或者从SUB那边发送什么内容。

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

这将同时保持TCP连接的活动,并且还会返回任何TCP断开连接,从而导致ZeroMQ自动重新连接。