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

У меня простая настройка 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)

Это приложение запросило среду выполнения прекратить его необычным способом. Пожалуйста, обратитесь в службу поддержки приложения для получения дополнительной информации.

Я пробовал неблокирующие версии и версии программ-опрашивателей, но в любом случае эта проблема мгновенного завершения сохраняется. Есть ли что-то очевидное, что я должен делать, а я нет? (То есть для кого-то очевидного :)).

EDIT:

Нашел следующее: https://zeromq.jira.com/browse/LIBZMQ-207

Кажется, это известная проблема.

Эта ссылка дополнительно ссылается на Github, где журнал изменений для 2.1.10 содержит следующее примечание:

  • Исправлена ​​ошибка 207, ошибка подтверждения в zmq_connecter.cpp: 48, когда неверная строка zmq_connect () или имя хоста не может быть решена. Вызов zmq_connect () теперь возвращает -1 в обоих этих случаях.

Хотя connect () действительно генерирует исключение Invalid Argument в Python (очевидно, не C #?), recv () все еще не работает Если абонентский аппарат внезапно потеряет сеть, этот абонент просто перестанет функционировать.

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

1 Ответ

1 голос
/ 01 декабря 2011

Оригинальный вопрос: Есть ли что-то очевидное, что я должен делать, но я нет?

Нет.

Обходной путь на данный момент заключается в использовании IP-адресации.Это не вызывает сбой программы при отключении сети для ZMQ 2.1.x.

...