2016-08-17 13 views
1

Я использую MQTT во встроенных приложениях. Я подробно рассмотрел документацию, и я понимаю, как функция QoS реализована в MQTT и что означает каждое значение.MQTT QoS Downgrade

Как известно, MQTT делает понижение QoS, что означает, что сообщение будет доставлено с самым низким значением QoS между отправителем и получателем. Это понимается, и для большинства сопоставлений QoS между отправкой и получением это имеет смысл.

Однако у меня есть проблема с конкретной ситуацией. Что происходит, когда сообщение публикуется с QoS 1, в то время как у клиента есть подписка на QoS 2?

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

Как можно решить эту серьезную проблему? По сути, я не могу доверять настройке QoS 2.

(Обратите внимание, что это не будет проблемой, поскольку я мог бы просто публиковать сообщения с QoS 2. Однако это становится проблемой, когда клиенты публикации выходят из-под контроля, и нет гарантии, какие QoS они будут используйте.)

ответ

2

Как вы уже указывали, когда исходный отправитель отправляет сообщение брокеру с QoS 1, сообщение может поступать несколько раз у брокера, что означает, что брокер может доставить это сообщение (QoS 2) также несколько раз. Поскольку время между первым сообщением QoS 1 и вторым может быть очень длинным (в случае, если первоначальный отправитель находится в автономном режиме после первоначальной отправки, и поэтому повторная доставка происходит позднее), точно-раз-гарантии было бы очень сложно гарантировать брокерскую сторону для подписчиков сообщения.

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

+0

Так что, по существу, в публикациях, выходящих из-под контроля, я всегда должен принимать QoS 0 или QoS 1, но никогда QoS2, правильно? –