Понижение QoS MQTT

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

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

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

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

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

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


person Fotis Panagiotopoulos    schedule 17.08.2016    source источник


Ответы (1)


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

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

person Dominik Obermaier    schedule 18.08.2016
comment
Так что, по сути, в неподконтрольных мне клиентах публикации я всегда должен предполагать QoS 0 или QoS 1, но никогда не QoS2, верно? - person Fotis Panagiotopoulos; 18.08.2016
comment
@FotisPanagiotopoulos: спецификация клиента должна указывать, с каким уровнем публикуются сообщения, и затем вы должны подписаться с правильным уровнем. Все остальное просто напрашивается на неприятности. Например, обновление уровня QoS явно запрещено спецификацией MQTT - поэтому, если вы всегда подписываете QoS 1, а клиенты публикуют QoS 0, вы можете никогда не получать никаких сообщений. У большинства брокеров есть возможность разрешить это в любом случае, но, опять же, побочные эффекты будут зависеть от реализации и контекста. - person ChrisWue; 31.10.2018