我一直在阅读心跳上的ZMQ documentation,并且读到应该使用乒乓球方法而不是用于偏执海盗模式的方法
对于Paranoid Pirate,我们选择了第二种方法。它可能没有 是最简单的选择:如果今天设计这个,我可能会试试 改为乒乓球。
但是,我发现在任何地方都没有关于乒乓模式的文档(为什么它首选?)。唯一可能的代码示例是pyzmq示例中的ping.py和pong.py。
这些足够的例子是否证明了双向心跳?如果是这样," pong"检测到" ping"还没活着?还有关于没有有效载荷的声明,但ping message是否也被认为是有效载荷?
一个对等体向另一个对等体发送ping命令,该命令以pong回复 命令。两个命令都没有任何有效载荷
同样,这些示例可能不构成此方法的完整实现。如果有人可以分享一些经验,描述或代码示例,我会很感激。
我的目标是为经纪人和工作人员(路由器经销商)添加心跳功能。工人和经纪人都应该检测到合作伙伴不再可用,并且(a)取消注册工人(如果经纪人检测到工人已经离开),或者(b)尝试稍后重新连接(如果是工人)失去了与经纪人的联系)。工作人员在忙碌时并不需要,因为无论如何它都不会在经纪人的闲置工人队列中排队。
答案 0 :(得分:0)
ZeroMQ没有提供任何机制来帮助您确定另一侧的套接字是否存活。 因此,心跳模式的标准方案(我认为这是最方便的)是超时的心跳。
您需要客户端和服务器上的套接字,它们在不同的线程中工作。还有一个投票人。
Poller示例:
p = zmq.Poller()
p.register(socket, zmq.POLLIN)
Сlient向服务器发送消息并使用超时轮询套接字。选择最适合您的超时值,并清楚地表明服务器不可用。
投票示例:
msg = dict(p.poll(timeout))
if socket in msg and msg[socket] == zmq.POLLIN:
# we get heartbeat from server
else:
# timeout - server unavailable
服务器也是如此。
我认为这可能会有所帮助。