【问题标题】:ZMQ Pub-Sub Program Failure When Losing Network ConnectivityZMQ Pub-Sub 程序在失去网络连接时失败
【发布时间】:2011-11-30 22:06:43
【问题描述】:

我在中型网络上使用 ZMQ 2.1 进行了简单的发布-订阅设置。虽然一些订阅者使用 C# 绑定,但其他订阅者使用 Python 绑定,而我遇到的问题是相同的。

如果我从运行订阅者的机器上拔下网络电缆,我会收到一个无法捕获的错误,该错误会立即终止该订阅者。

这是一个非常简单的 Python 订阅者示例(不是实际的生产代码,但足以重现问题):

import zmq

def main(server_address, port):

    context = zmq.Context()
    sub_socket = context.socket(zmq.SUB)
    sub_socket.connect("tcp://" + server_address + ":" + str(port))
    sub_socket.setsockopt(zmq.SUBSCRIBE, "KITH1S2")

    while True:

        msg = sub_socket.recv()      
        print msg  

if __name__ == "__main__": main("company-intranet", 4000)

在 C# 中,程序只是静默终止。在 Python 中,我至少得到了这个:

断言失败:rc == 0 (....\src\zmq_connector.cpp:48)

此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。

我尝试过非阻塞版本和轮询版本,但无论哪种情况,这种即时终止问题都仍然存在。有什么明显的事情我应该做,但我没有? (也就是说,对其他人来说很明显:))。

编辑:

找到以下内容:https://zeromq.jira.com/browse/LIBZMQ-207

似乎这是/曾经是一个已知问题。

该链接进一步链接到 Github,其中 2.1.10 的更改日志有以下注释:

  • 修复了问题 207,zmq_connecter.cpp:48 中的断言失败,当 使用了无效的 zmq_connect() 字符串,或者无法使用主机名 解决。 zmq_connect() 调用现在在这两种情况下都返回 -1。

虽然 connect() 确实在 Python 中引发了 Invalid Argument 异常(显然不是 C#?),但 recv() 仍然失败。如果订户机器突然失去网络,该订户将停止运行。

所以 - 我将尝试使用 IP 地址而不是命名地址,看看这是否会绕过这个问题。不理想,但比 insta-crash 好。

【问题讨论】:

    标签: c# python publish-subscribe zeromq


    【解决方案1】:

    原始问题:有什么明显的事情我应该做但我没有做吗?

    没有。

    目前的解决方法是使用 IP 寻址。这不会在 ZMQ 2.1.x 的网络断开时导致程序失败。

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多