ZMQ中的乒乓心跳

时间:2017-04-12 13:53:37

标签: zeromq pyzmq

我一直在阅读心跳上的ZMQ documentation,并且读到应该使用乒乓球方法而不是用于偏执海盗模式的方法

  

对于Paranoid Pirate,我们选择了第二种方法。它可能没有   是最简单的选择:如果今天设计这个,我可能会试试   改为乒乓球。

但是,我发现在任何地方都没有关于乒乓模式的文档(为什么它首选?)。唯一可能的代码示例是pyzmq示例中的ping.pypong.py

这些足够的例子是否证明了双向心跳?如果是这样," pong"检测到" ping"还没活着?还有关于没有有效载荷的声明,但ping message是否也被认为是有效载荷?

  

一个对等体向另一个对等体发送ping命令,该命令以pong回复   命令。两个命令都没有任何有效载荷

同样,这些示例可能不构成此方法的完整实现。如果有人可以分享一些经验,描述或代码示例,我会很感激。

我的目标是为经纪人和工作人员(路由器经销商)添加心跳功能。工人和经纪人都应该检测到合作伙伴不再可用,并且(a)取消注册工人(如果经纪人检测到工人已经离开),或者(b)尝试稍后重新连接(如果是工人)失去了与经纪人的联系)。工作人员在忙碌时并不需要,因为无论如何它都不会在经纪人的闲置工人队列中排队。

1 个答案:

答案 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

服务器也是如此。

我认为这可能会有所帮助。