Качество обслуживания
Протокол MQTT определяет качество обслуживания сообщений (Quality of Service), что обеспечивает надежность доставки сообщений в различных сетевых средах. В центре внимания протокола MQTT лежит разработка QoS. Как протокол, специально разработанный для сценариев IoT, сценарии работы MQTT — это не только ПК, но и более широкий спектр сетей с узкой полосой пропускания и устройств с низким энергопотреблением. Если проблему качества передачи можно решить на уровне протокола, это принесет большую пользу. Разработка приложений IoT обеспечивает большое удобство.
Два бита QoS сообщения PUBLISH не могут быть установлены в 1 одновременно [MQTT-3.3.1-4]. Если сервер или клиент получает недопустимое сообщение PUBLISH, в котором оба бита QoS установлены в 1, используйте сообщение DISCONNECT, содержащее код причины 0x81 (недопустимое сообщение), чтобы закрыть сетевое соединение.
Принцип работы
Когда QoS равен 0, распространение сообщений зависит от возможностей базовой сети. Издатель опубликует сообщение только один раз, получатель не ответит на сообщение, а издатель не будет сохранять и повторно отправлять сообщение. Сообщения имеют наибольшую эффективность передачи на этом уровне, но могут быть доставлены один раз или не доставлены вообще.
Если QoS равен 1, сообщение гарантированно будет доставлено хотя бы один раз. MQTT гарантирует QoS 1 посредством простого механизма подтверждения. Издатель опубликует сообщение и дождется ответа на сообщение PUBACK получателя. Если ответ PUBACK не получен в течение указанного времени, издатель установит для DUP сообщения значение 1 и повторно отправит сообщение. Получатель должен ответить сообщением PUBACK при получении сообщения с QoS 1. Получатель может получить одно и то же сообщение несколько раз. Независимо от флага DUP, получатель будет рассматривать полученное сообщение как новое сообщение и отправлять сообщение PUBACK. ответил.
Когда QoS равен 2, издатель и подписчик используют два сеанса, чтобы гарантировать, что сообщение будет доставлено только один раз. Это самый высокий уровень качества обслуживания. Потеря и дублирование сообщений недопустимы. За использование этого уровня качества обслуживания потребуются дополнительные накладные расходы.
После того как издатель опубликует сообщение с QoS, равным 2, он сохранит опубликованное сообщение и будет ждать, пока получатель ответит сообщением PUBREC. После того как отправитель получит сообщение PUBREC, он может безопасно отказаться от ранее опубликованного сообщения, поскольку он уже знает. как его получить Сообщение было успешно получено. Издатель сохранит сообщение PUBREC и ответит сообщением PUBREL, ожидая, пока получатель ответит сообщением PUBCOMP. Когда отправитель получит сообщение PUBCOMP, он очистит ранее сохраненное состояние.
Когда получатель получает сообщение PUBLISH с QoS 2, он обрабатывает сообщение и отвечает сообщением PUBREC. Когда получатель получает сообщение PUBREL, он отбрасывает все сохраненные состояния и отвечает PUBCOMP.
Всякий раз, когда пакет теряется во время передачи, отправитель несет ответственность за повторную отправку последнего сообщения. Это справедливо независимо от того, является ли отправляющая сторона издателем или брокером. Следовательно, принимающая сторона также должна отвечать на каждое командное сообщение.
Идентификатор пакета
MQTT Соглашение предусматривает, что по одному выпуску за раз QoS > 0 сообщению должен быть присвоен ненулевой идентификатор сообщения, который в данный момент не используется. [MQTT-2.2.1-4]. После обработки подтверждения, соответствующего этому сообщению, идентификатор сообщения освобождается и может быть повторно использован. Определенный идентификатор сообщения не может использоваться несколькими командами в определенное время.
издатели и подписчики
Сообщение публикации MQTT QoS не является сквозным, а между клиентом и сервером. Уровень QoS, на котором подписчики получают сообщения MQTT, в конечном итоге зависит от QoS опубликованных сообщений и QoS подписок на темы.
Как выбрать качество обслуживания
Чем выше уровень QoS, тем сложнее процесс и больше потребление системных ресурсов. Приложения могут выбирать соответствующий уровень QoS в зависимости от своих сетевых сценариев и бизнес-потребностей. Например, при взаимодействии сообщений между службами в одной подсети часто используется QoS 0, тогда как при передаче сообщений в реальном времени через Интернет часто используется QoS 2; используется. Сценариев относительно немного, и они подходят для более требовательных сценариев, таких как запросы платежей.