ZMQ中的乒乓心跳

Ping pong heartbeat in ZMQ

我一直在阅读关于心跳的 ZMQ documentation 并且读到应该使用乒乓方法而不是用于 Paranoid Pirate 模式的方法

For Paranoid Pirate, we chose the second approach. It might not have been the simplest option: if designing this today, I'd probably try a ping-pong approach instead.

但是,我在任何地方都找不到关于乒乓模式的文档(以及为什么它是首选?)。唯一可能的代码示例是 pyzmq 示例中的 ping.py and pong.py

这些足够的例子可以证明双向心跳吗?如果是这样,"pong" 是如何检测到 "ping" 不再活着的?也有关于没有有效载荷的说法,但是 ping message 不也被认为是有效载荷吗?

One peer sends a ping command to the other, which replies with a pong command. Neither command has any payload

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

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

ZeroMQ 不提供任何机制来帮助您查明另一端的套接字是否处于活动状态。 因此,心跳模式的标准场景(我认为是最方便的)是带超时的心跳。

您需要客户端和服务器上的套接字,它们在不同的线程中工作。还有一个轮询器。

轮询器示例:

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

服务器也一样。

我认为这会有所帮助。