【问题标题】:Ping pong heartbeat in ZMQZMQ中的乒乓心跳
【发布时间】:2017-09-08 08:31:06
【问题描述】:

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

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

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

这些例子足以证明双向心跳吗?如果是这样,“pong”如何检测到“ping”不再存在?也有人声称没有有效载荷,但ping message 不也被视为有效载荷吗?

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

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

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

【问题讨论】:

    标签: zeromq pyzmq


    【解决方案1】:

    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
    

    服务器也是如此。

    我认为这会有所帮助。

    【讨论】:

    • 这是文档中“描述”为乒乓球方法的内容吗?如果是,那么消息的有效负载是什么?
    • 不是来自文档,是常用的。我们在有关 ping-pong 的文档中只有一般描述,您可以根据您的任务根据需要实施它。通常,如果您有 2 台服务器,则不需要任何有效负载,因为您只需要知道收到了 msg 的事实。但是您可以在 msg 中输入您想要的所有内容,例如服务器 ID。
    • 如果服务器不可用并且客户端尝试重新连接怎么办?客户端是否需要断开连接并重新启动它,还是由 ZMQ 处理?
    • @orange 如果是 REQ-REP 对,并且 socket 没有得到响应,则需要关闭它并重新连接,导致 REQ socket 不能连续发送两条消息。在另一种情况下,例如,如果您使用 ROUTER 并按 ID 发送消息,它可能会丢失路由。一切都取决于您选择的插座。在常见情况下,我的建议是在超时时关闭并重新连接套接字。这个操作很贵但是我觉得服务器一天应该不会掉一百次)))
    • 这是一个路由器(服务器)-经销商(客户端)连接。如果我不必这样做,并且这个重新连接是在 ZMQ 内部管理的,我想我不会手动进行......重新连接后 IP 地址和端口都不会改变,那为什么路由会丢失?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多