Надежность подключения в основном зависит от протокола TCP - если сокет считает, что он подключен, то сообщение проходит. Если пакеты потеряны, TCP обнаруживает это и пытается повторно передать их (see here для получения дополнительной информации). Все это происходит «бесплатно» по отношению к ZMQ, любой тип соединения с использованием TCP будет вести себя одинаково.
Когда соединение TCP теряется, который, предположительно, может произойти, если соединение очень ненадежны и сообщение никогда не получает через после неоднократных попыток TCP, затем ZMQ добавляет другой, отдельный слой надежности на вершине из этого, позволяя вашему приложению повторно подключаться.
Что происходит с исходными или последующими сообщениями во время этого отключения, зависит от выбранного типа гнезда ZMQ. Некоторые типы сокетов выводят сообщения, некоторые типы сокетов ставят их в очередь. Если сообщение уже было в пути, оно может быть потеряно, потому что отправляющий сокет отказался от контроля над ним.
Как правило, если вы хотите абсолютную надежность доставки сообщений, вы сами будете писать это в своем приложении с вашими собственными подтверждениями о том, что сообщения были получены. В большинстве случаев требуется что-то меньшее, чем полная надежность, и вы просто будете полагаться на TCP и ZMQ, чтобы выполнить работу в основном. Если вы так сосредоточены на производительности, что даже надежность TCP замедлит вас слишком много, и вы предпочтете просто отказаться от этих данных и двигаться дальше, вам нужно будет использовать UDP - я слышал о людях, использующих UDP, ZMQ, но я не пробовал, и я не думаю, что он полностью поддерживается по всем направлениям.