ZeroMQ: Как установить HWM, чтобы он стал действительно "нулем" (не API def'd 0 == INFINITY)?
У меня вопрос по поводу максимальной отметки (HWM
) для ZeroMQ PUB/SUB
подключение. Эффективно хочу установить HWM
значение до нуля.
То есть: если сообщение не может быть доставлено, просто отбросьте его.
К сожалению, кажется, что HWM
значение может быть установлено только как 1
,
" 0
"означает бесконечность в соответствии с документами API и моим тестированием.
На мой взгляд, используя 0
"означать" бесконечный "в API было ошибкой:/
Это вряд ли изменится.
Есть ли обходной путь, который не требует перекомпиляции ZeroMQ
?
Проблема, с которой я сталкиваюсь, заключается в том, что с ненулевым HWM
при сбое соединения по крайней мере одно сообщение находится в очереди и отправляется после восстановления соединения. К этому времени сообщение больше не является действительным и ему нельзя доверять.
Я думал об отбрасывании сообщений на принимающей стороне, включая метку времени, сгенерированную на отправляющей стороне. К сожалению, системные часы не подключены к Интернету и значительно дрейфуют. Синхронизация часов с дополнительным REQ/REP
Сокет представит отправителю другие сложные состояния запуска и выглядит как ненужный обходной путь.
1 ответ
Да:
, , , может попытаться охотиться на того же оленя из противоположного леса
Исходя из необходимости,
заявленная в исходной задаче мотивация,
решение может быть получено из установки не ZMQ_???HWM
,
но другой параметр:
ZMQ_CONFLATE
: Сохранить только последнее сообщение
Значение по умолчанию0
(ложный)
Применимые типы сокетовZMQ_PULL
,ZMQ_PUSH
,ZMQ_SUB
,ZMQ_PUB
,ZMQ_DEALER
Если установлено, сокет должен хранить только одно сообщение в своей входящей / исходящей очереди, причем это сообщение является последним полученным сообщением / последним отправленным сообщением. ИгнорируетZMQ_RCVHWM
а такжеZMQ_SNDHWM
опции.
Не поддерживает многокомпонентные сообщения, в частности, только одна его часть хранится во внутренней очереди сокетов.
и некоторая помощь может исходить от "превентивной меры", скрытой в:
ZMQ_IMMEDIATE
: Очередь сообщений только для завершенных подключений
Все применимые типы сокетов, только для транспортов с установлением соединения.
По умолчанию очереди исходящих подключений будут заполняться, даже если подключение еще не завершено. Это может привести к "потерянным" сообщениям в сокетах с циклической маршрутизацией (REQ, PUSH, DEALER).
Если эта опция установлена в 1, сообщения должны быть поставлены в очередь только для завершенных соединений. Это приведет к блокировке сокета, если нет других подключений, но предотвратит заполнение очередей в каналах, ожидающих подключения.