Вы находитесь на странице: 1из 5

Что такое качество обслуживания?

Уровень качества обслуживания (QoS) - это соглашение между


отправителем сообщения и получателем сообщения, которое определяет
гарантию доставки для конкретного сообщения. В MQTT существует 3
уровня QoS:

● Не более одного раза (0)


● По крайней мере, один раз (1)
● Ровно один раз (2).

Когда вы говорите о QoS в MQTT, вам необходимо рассмотреть две стороны


доставки сообщений:

1. Доставка сообщений от публикующего клиента к брокеру.


2. Доставка сообщений от брокера к подписывающемуся клиенту.

Мы рассмотрим эти две стороны доставки сообщений отдельно, поскольку


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

Почему важно качество обслуживания?

QoS является ключевой особенностью протокола MQTT. QoS дает клиенту


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

Как это работает?

Давайте подробнее рассмотрим, как каждый уровень QoS реализован в


протоколе MQTT и как он функционирует:

QoS 0 - не более одного раза

Минимальный уровень QoS равен нулю. Этот уровень обслуживания


гарантирует доставку по принципу best-effort. Гарантия доставки
отсутствует. Получатель не подтверждает получение сообщения, и
сообщение не сохраняется и не передается отправителем повторно. Уровень
QoS 0 часто называют "отправить и забыть", и он обеспечивает ту же
гарантию, что и основной протокол TCP.

QoS 1 - не менее одного раза

Уровень QoS 1 гарантирует, что сообщение будет доставлено получателю


хотя бы один раз. Отправитель хранит сообщение, пока не получит от
получателя пакет PUBACK, подтверждающий получение сообщения.
Сообщение может быть отправлено или доставлено несколько раз.

Отправитель использует идентификатор пакета в каждом пакете, чтобы


сопоставить пакет PUBLISH с соответствующим пакетом PUBACK. Если
отправитель не получает пакет PUBACK за разумный промежуток времени,
он повторно отправляет пакет PUBLISH. Когда получатель получает
сообщение с QoS 1, он может обработать его немедленно. Например, если
получателем является брокер, брокер отправляет сообщение всем
подписавшимся клиентам, а затем отвечает пакетом PUBACK.

Если публикующий клиент отправляет сообщение повторно, он


устанавливает флаг дублирования (DUP). В QoS 1 этот флаг DUP
используется только для внутренних целей и не обрабатывается брокером
или клиентом. Получатель сообщения отправляет PUBACK, независимо от
флага DUP.

QoS 2 - ровно один раз

QoS 2 - это самый высокий уровень обслуживания в MQTT. Этот уровень


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

Когда получатель получает пакет QoS 2 PUBLISH от отправителя, он


обрабатывает сообщение о публикации соответствующим образом и отвечает
отправителю пакетом PUBREC, подтверждающим пакет PUBLISH. Если
отправитель не получает пакет PUBREC от получателя, он снова посылает
пакет PUBLISH с флагом дублирования (DUP), пока не получит
подтверждение.

Как только отправитель получает пакет PUBREC от получателя, отправитель


может смело отбрасывать первоначальный пакет PUBLISH. Отправитель
сохраняет пакет PUBREC от получателя и отвечает пакетом PUBREL.

После получения пакета PUBREL получатель может отбросить все


сохраненные состояния и ответить пакетом PUBCOMP (то же самое
происходит, когда отправитель получает PUBCOMP). Пока приемник не
завершит обработку и не отправит пакет PUBCOMP обратно отправителю, он
хранит ссылку на идентификатор пакета исходного пакета PUBLISH. Этот
шаг важен для того, чтобы избежать обработки сообщения во второй раз.
После того как отправитель получает пакет PUBCOMP, идентификатор
пакета опубликованного сообщения становится доступным для повторного
использования.

Когда поток QoS 2 завершен, обе стороны уверены, что сообщение


доставлено, а отправитель имеет подтверждение доставки.

Если пакет теряется по пути, отправитель несет ответственность за


повторную передачу сообщения в течение разумного времени. Это
одинаково верно, если отправитель является клиентом MQTT или брокером
MQTT. Получатель обязан ответить на каждое командное сообщение
соответствующим образом.

Хорошо знать

Некоторые аспекты QoS не очень очевидны на первый взгляд. Вот несколько


моментов, о которых следует помнить при использовании QoS:

Снижение уровня QoS

Как мы уже говорили, определение и уровни QoS между клиентом, который


отправляет (публикует) сообщение, и клиентом, который получает
сообщение, - это две разные вещи. Уровни QoS этих двух взаимодействий
также могут быть разными. Клиент, отправляющий сообщение PUBLISH
брокеру, определяет QoS этого сообщения. Однако когда брокер доставляет
сообщение получателям (подписчикам), брокер использует QoS, который
получатель (подписчик) определил во время подписки. Например, клиент А
является отправителем сообщения. Клиент Б является получателем
сообщения. Если клиент Б подписался на брокера с QoS 1, а клиент А
отправил сообщение брокеру с QoS 2, брокер доставит сообщение клиенту Б
(получателю/подписчику) с QoS 1. Сообщение может быть доставлено
клиенту Б более одного раза, поскольку QoS 1 гарантирует доставку
сообщения хотя бы один раз и не препятствует многократной доставке
одного и того же сообщения.

Идентификаторы пакетов уникальны для каждого клиента

Идентификатор пакета, который MQTT использует для QoS 1 и QoS 2,


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

Лучшая практика

К нам часто обращаются за советом о том, как выбрать правильный уровень


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

Используйте QoS 0, когда ...

● У вас есть полностью или почти полностью стабильное соединение


между отправителем и получателем. Классическим случаем
использования QoS 0 является подключение тестового клиента или
внешнего приложения к брокеру MQTT по проводному соединению.
● Вы не возражаете, если несколько сообщений периодически теряются.
Потеря некоторых сообщений может быть приемлемой, если данные не
так важны или если данные отправляются с небольшими интервалами.
● Вам не нужна очередь сообщений. Сообщения ставятся в очередь для
отключенных клиентов, только если они имеют QoS 1 или 2 и
постоянную сессию.

Используйте QoS 1, когда ...

● Вам нужно получить каждое сообщение, и ваш сценарий


использования может справиться с дубликатами. Уровень QoS 1
является наиболее часто используемым уровнем обслуживания,
поскольку он гарантирует получение сообщения хотя бы один раз, но
допускает многократную доставку. Конечно, ваше приложение должно
терпимо относиться к дубликатам и уметь обрабатывать их
соответствующим образом.
● Вы не можете выдержать накладные расходы QoS 2. QoS 1 доставляет
сообщения намного быстрее, чем QoS 2.

Используйте QoS 2, когда ...

● Для вашего приложения критически важно получать все сообщения


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

Очередь сообщений QoS 1 и 2

Все сообщения, отправленные с QoS 1 и 2, ставятся в очередь для


автономных клиентов до тех пор, пока клиент снова не станет доступным.
Однако такая постановка в очередь возможна только в том случае, если
клиент имеет постоянную сессию.

Вам также может понравиться