我使用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
如果没有实施心跳以确定连接是否被切断,那么当用酒吧切断连接时,子网是否有任何方法可以自动重新连接?
答案 0 :(得分:4)
在zmq core github page上发布了一个问题,项目所有者已经回答了问题。
在SUB套接字执行时,PUB套接字可能会看到错误 不
ZMTP RFC有一个解决这个问题的心跳提议。 目前最好的解决方案是PUB套接字发送心跳(例如1个 第二个)流量低时,SUB套接字断开/重新连接 如果他们停止了这些。
实现了一个简单的心跳,它就像一个魅力。
答案 1 :(得分:0)
你可以使用这个小作弊,只需将它放在一个定时器上,每隔60秒发送一次,或者从SUB那边发送什么内容。
std::string ping = "PING";
controller->setsockopt(ZMQ_SUBSCRIBE, ping.c_str(), ping.length());
这将同时保持TCP连接的活动,并且还会返回任何TCP断开连接,从而导致ZeroMQ自动重新连接。