Объяснение постоянного сеанса MQTT и чистого сеанса

Постоянный сеанс MQTT

Нестабильные сети и ограниченные аппаратные ресурсы — две основные проблемы, с которыми приходится сталкиваться приложениям IoT. Соединение между клиентами MQTT и брокерами может быть аварийно разорвано в любое время из-за колебаний сети и нехватки ресурсов. Чтобы устранить влияние отключения сети на связь, протокол MQTT обеспечивает постоянный сеанс.

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

  • Избегайте дополнительных затрат на повторную подписку из-за перебоев в работе сети.
  • Избегайте пропущенных сообщений в периоды отсутствия связи.
  • Обеспечение того, чтобы на сообщения QoS 1 и QoS 2 не влияли перебои в работе сети.

Какие данные нужно хранить для постоянного сеанса?

Из вышеизложенного мы знаем, что Persistent Session должен хранить некоторые важные данные для восстановления сеанса. Часть этих данных хранится на стороне клиента, а часть — на стороне сервера.

Данные сеанса, хранящиеся в клиенте:

  • Сообщения QoS 1 и QoS 2 отправлены на сервер, но подтверждение еще не завершено.
  • Сообщения QoS 2, которые были получены от сервера, но еще не завершили подтверждение.

Данные сеанса, хранящиеся на сервере:

  • Существует ли сеанс, даже если остальная часть состояния сеанса пуста.
  • Сообщения QoS 1 и QoS 2, которые были отправлены клиенту, но еще не завершили подтверждение.
  • Сообщения QoS 0 (необязательно), сообщения QoS 1 и QoS 2, ожидающие передачи клиенту.
  • Сообщения QoS 2, полученные от клиента, но еще не завершившие подтверждение, сообщения Will и интервалы задержки Will.

Использование чистой сессии MQTT

Чистый сеанс — это бит флага, используемый для управления жизненным циклом состояния сеанса. Значение 1 означает, что при подключении будет создан новый сеанс, который будет автоматически уничтожен при отключении клиента. Если он равен 0, это означает, что он попытается повторно использовать предыдущий сеанс при подключении. Если соответствующей сессии нет, будет создана новая сессия, которая всегда будет существовать после отключения клиента.

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

Ниже приведена панель инструментов брокер MQTT с открытым исходным кодом EMQX. Вы можете видеть, что соединение на диаграмме отключено, но, поскольку это постоянный сеанс, его все еще можно просмотреть на панели инструментов.

MQTT-соединения

EMQX также поддерживает настройку параметров, связанных с сеансом, на панели инструментов.

MQTT-сессия

MQTT 3.1.1 не указывает, когда истечет срок действия постоянного сеанса; если понимать только на уровне протокола, этот постоянный сеанс должен быть постоянным. Однако в реальном сценарии это нецелесообразно, поскольку требует много ресурсов на стороне сервера. Таким образом, сервер обычно не следует протоколу точно, а предоставляет пользователю глобальную конфигурацию, чтобы ограничить время истечения сеанса.

Например, Бесплатный публичный брокер MQTT предоставленный EMQ, устанавливает время истечения сеанса 5 минут, максимальное количество сообщений 1000 и не сохраняет сообщения QoS 0.

Далее мы продемонстрируем использование Clean Session с кроссплатформенной программой с открытым исходным кодом. Клиентский инструмент MQTT 5.0 для настольных ПК — MQTT X.

После открытия MQTT X нажмите New Connection кнопка для создания MQTT-соединение как показано ниже.

Нажмите Новое подключение

Создайте соединение с именем MQTT_V3 с отключенной очисткой сеанса (т. е. false) и выберите версию MQTT 3.1.1, затем нажмите Connect кнопку в правом верхнем углу.

Сервер по умолчанию, к которому подключено Бесплатный публичный брокер MQTT предоставлено EMQ.

Создать соединение

Подписаться на clean_session_false тема после успешного подключения и QoS установлен на 1.

Подпишитесь на тему clean_session_false

После успешной подписки нажмите Disconnect кнопку в правом верхнем углу. Затем создайте соединение с именем MQTT_V3_Publish снова с версией MQTT, установленной на 3.1.1, и опубликуйте два сообщения QoS 1 на clean_session_false тему после успешного подключения.

Публикация сообщений MQTT

Затем выберите соединение MQTT_V3 и нажмите Connect кнопка подключения к серверу. Вы успешно получите два сообщения, которые были опубликованы в течение автономного периода.

Получение сообщений MQTT

Улучшения сеанса в MQTT 5.0

В MQTT 5.0 Чистый сеанс разделен на Чистый старт и Интервал истечения срока действия. Чистый запуск указывает, следует ли создать новый сеанс или попытаться повторно использовать существующий сеанс при подключении. Интервал истечения сеанса используется для указания времени истечения срока действия сеанса после отключения сетевого подключения.

Чистый старт true означает, что любая существующая сессия должна быть отброшена, и создана совершенно новая сессия; false указывает, что сеанс, связанный с идентификатором клиента, должен использоваться для возобновления связи с клиентом (если сеанс не существует).

Интервал истечения сеанса решает проблему потери ресурсов сервера, вызванную постоянным существованием постоянных сеансов в MQTT 3.1.1. Параметр 0 или none указывает, что срок действия сеанса истекает при отключении. Значение больше 0 указывает, сколько секунд будет оставаться сеанс после закрытия сетевого подключения. Настройка 0xFFFFFFFF означает, что сессия никогда не истечет.

Более подробная информация доступна в блоге: Интервал чистого запуска и истечения сеанса.

Вопросы и ответы о сеансе MQTT

Когда сеанс заканчивается, сохраняются ли сохраненные сообщения?

Сохраненные сообщения MQTT не являются частью состояния сеанса и не будут удалены в конце сеанса.

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

Протокол MQTT разработал поле Session Present для сообщения CONNACK, начиная с версии 3.1.1. Когда сервер возвращает значение 1 для этого поля, это означает, что текущее соединение будет повторно использовать сеанс, сохраненный сервером. Клиент может использовать это значение поля для принятия решения о повторной подписке после успешного соединения.

Лучшие практики использования Persistent Session

  • Вы не можете использовать динамический идентификатор клиента. Необходимо убедиться, что идентификатор клиента фиксирован для каждого подключения клиента.
  • Правильно оценивайте время истечения сеанса на основе производительности сервера, сетевых условий и типа клиента. Установка слишком длинного значения потребует больше ресурсов на стороне сервера. А установка слишком короткого значения приведет к истечению срока действия сеанса до успешного повторного подключения.
  • Когда клиент определяет, что сеанс больше не нужен, вы можете повторно подключиться, используя Clean Session как true, а затем отключиться после успешного повторного подключения. В случае MQTT 5.0 вы можете установить интервал истечения срока действия сеанса равным 0 непосредственно при отключении, что указывает на то, что срок действия сеанса истечет при отключении соединения.

Резюме

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

Первоначально опубликовано на https://www.emqx.com.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *