在 zmq 订阅者中自动重新连接

Auto-reconnect in zmq subscriber

我有一台服务器,有时会向所有订阅者发送一些消息。有时我的意思是,也许每个月一次。也许有一天它需要发送 100 个,而在那之后,它花了几个月没有发送更多。但我需要它才能做到。

到目前为止,我在 python 中有一个发布者发送帧,在 python 中也有一个订阅者,在每个终端设备中。终端设备中的脚本似乎在一段时间后断开连接。在我的测试中,我可以发送消息一段时间,但如果我离开发送消息大约 10 分钟,则永远不会收到下一条消息。

有没有办法让订阅者时不时发送心跳之类的?或者尽快检测断开并重新连接?我不介意错过一个包裹,因为我有一个消息控件,所以如果服务器没有收到回复,它会在下一分钟内收到。

我有这个代码连接到服务器:

portSubOuter = "6100"
context = zmq.Context()
socketOuter = context.socket(zmq.SUB)
socketOuter.connect("tcp://my_domain_url:%s"% portSubOuter)
socketOuter.setsockopt(zmq.SUBSCRIBE, '')

这是我要阅读的代码:

macRecv = socketOuter.recv()
print "Packet for mac: %s"%macRecv
if macRecv == repr(myMACOuter):
    more = True
    while more:
        part_received = socketOuter.recv()
        part.append(part_received)
        more = socketOuter.getsockopt(zmq.RCVMORE)
    ....

我需要在发布者端实现心跳吗?喜欢每 2 分钟左右发送一条消息吗?

心跳是一个很好的解决方案,但我认为您正在寻找的是 ZMQ Keepalive 功能。请参阅 zmq_setsockopt 手册页,尤其是这些选项

ZMQ_TCP_KEEPALIVE
ZMQ_TCP_KEEPALIVE_IDLE
ZMQ_TCP_KEEPALIVE_CNT
ZMQ_TCP_KEEPALIVE_INTVL

在 C# 中,我在我的实现中默认做这样的事情,最终映射到上面的选项。不确定您的绑定是什么样的,但有类似的属性或 zmq_setsockopt 调用。里程数可能因您的 OS 和网络

而异
_socket.Options.TcpKeepalive = Enable
_socket.Options.TcpKeepaliveIdle = (int)new TimeSpan(0, 5, 0).TotalSeconds;
_socket.Options.TcpKeepaliveInterval = (int)new TimeSpan(0, 0, 30).TotalSeconds;