ZMQ - клиент-сервер: клиент неожиданно отключился, как его обнаруживает сервер? - PullRequest
0 голосов
/ 04 сентября 2018

Несколько клиентов подключены к одному ZMQ_PUSH сокету. Когда клиент неожиданно выключается, сервер не получает предупреждение и продолжает отправлять ему сообщения. Несмотря на использование ZMQ_OBLOCK и установку ZMQ_HWM на 5 (в очереди только 5 сообщений максимум), мой сервер не получит ошибку, пока клиент не будет повторно подключен и все сообщения в очереди не будут получены сразу.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Недавно я столкнулся с подобной проблемой при использовании ZMQ. Мы бы отключили питание для взаимосвязанных систем, и абонент не сможет автоматически подключиться. Оказывается, недавно (в прошлом году или около того) был реализован механизм сердцебиения через ZMTP, базовый протокол, используемый сокетами ZMQ.

Если вы используете ZMQ версии 4.2.0 или выше, изучите настройку параметров сокета ZMQ_HEARTBEAT_IVL и ZMQ_HEARTBEAT_TIMEOUT (http://api.zeromq.org/4-2:zmq-setsockopt).), которые задают интервал между биениями (ZMQ_HEARTBEAT_IVL) и продолжительность ожидания ответа до закрытие соединения (ZMQ_HEARTBEAT_TIMEOUT).

РЕДАКТИРОВАТЬ: Вы должны установить эти параметры сокета перед подключением.

0 голосов
/ 12 сентября 2018

В zmq нет ничего, что явно обнаруживало бы неожиданное завершение программы на другом конце сокета или непредвиденный и неожиданный сбой сетевого соединения.

Был исторический разговор о добавлении в zmq своего рода внутреннего пинг-понга "ты еще жив", но в прошлый раз, когда я смотрел (довольно давно), было решено не делать этого.

Это означает, что сбои, сбои в сети и т. Д. Не обязательно обрабатываются очень аккуратно, и ваше приложение не обязательно будет знать, что происходит или были ли сообщения успешно отправлены. Это актерская модель в конце концов. Когда вы обнаружите, что ваша программа может в конечном итоге определить, что-то ранее пошло не так. Тайм-ауты в zmtp определят сбой, и в конечном итоге последствия вернутся обратно в вашу программу.

Чтобы сделать что-то лучше, вам нужно наложить что-то вроде пинг-понга сверху (например, для этого есть отдельный сокет, чтобы вы могли отслеживать доступность клиентов), но затем это очень усложняет задачу. используйте приятные части ZMQ, такие как push / pull. Возможно, именно поэтому (превосходные) авторы zmq решили не вкладывать это в себя.

Когда я столкнулся с подобной проблемой, я написал свою собственную транспортную библиотеку. Я не смог найти один из готовых, который дал бы хорошее поведение перед лицом сетевых сбоев, сбоев и т. Д. Он реализовал CSP, а не модель актера, не был ужасно быстрым (неизбежность), не делал шаблонов в zmq смысл, но означал, что программы знали точно, где сообщения были всегда, и знали, что клиенты были живы или недоступны в любое время. CSPness также означал, что передача сообщений была рандомизацией при выполнении, поэтому программы знают, что делают друг друга тоже.

...