Сбой программы ZMQ Pub-Sub при потере сетевого подключения

У меня есть простая настройка 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 (.... \ 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 (очевидно, не в C #?), recv () по-прежнему не работает. Если абонентская машина внезапно теряет сеть, этот абонент просто перестанет работать.

Итак - я собираюсь попробовать использовать IP-адреса вместо именованных адресов, чтобы посмотреть, поможет ли это обойти проблему. Не идеально, но лучше, чем insta-crash.

6
задан jomido 11 January 2012 в 18:35
поделиться