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