当失去网络连接时,ZMQ Pub-Sub程序失败



我在一个中等规模的网络上使用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 (....srczmq_connector.cpp:48)

这个应用程序请求运行时以一种不寻常的方式终止它。请与应用程序支持团队联系以获取更多信息。

我尝试了非阻塞版本和轮询版本,但在任何一种情况下,这种即时终止问题仍然存在。是否有一些我应该做但我没有做的事情?(也就是说,对别人来说是显而易见的:))。

编辑:

发现如下:https://zeromq.jira.com/browse/LIBZMQ-207

似乎这是一个已知的问题。

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

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

虽然connect()确实会在Python中抛出无效参数异常(显然不是c# ?),但recv()仍然失败。如果订阅者机器突然失去网络,该订阅者将停止工作。

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

最初的问题:是否有一些明显我应该做但我没有做的事情?

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

最新更新