Постоянный сеанс 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. Вы можете видеть, что соединение на диаграмме отключено, но, поскольку это постоянный сеанс, его все еще можно просмотреть на панели инструментов.
EMQX также поддерживает настройку параметров, связанных с сеансом, на панели инструментов.
MQTT 3.1.1 не указывает, когда истечет срок действия постоянного сеанса; если понимать только на уровне протокола, этот постоянный сеанс должен быть постоянным. Однако в реальном сценарии это нецелесообразно, поскольку требует много ресурсов на стороне сервера. Таким образом, сервер обычно не следует протоколу точно, а предоставляет пользователю глобальную конфигурацию, чтобы ограничить время истечения сеанса.
Например, Бесплатный общедоступный брокер MQTT, предоставляемый EMQ, устанавливает время истечения сеанса 5 минут, максимальное количество сообщений 1000 и не сохраняет сообщения QoS 0.
Далее мы продемонстрируем использование Clean Session с кроссплатформенным клиентским инструментом MQTT 5.0 для настольных компьютеров — MQTT X с открытым исходным кодом.
После открытия MQTT X нажмите кнопку New Connection
, чтобы создать соединение MQTT, как показано ниже.
Создайте соединение с именем MQTT_V3
с отключенным параметром Clean Session (т. е. false) и выберите версию MQTT 3.1.1, затем нажмите кнопку Connect
в правом верхнем углу.
Сервер, к которому подключено по умолчанию, — это Free Public MQTT Broker, предоставленный EMQ.
Подпишитесь на тему clean_session_false
после успешного подключения и QoS, установленного на 1.
После успешной подписки нажмите кнопку Disconnect
в правом верхнем углу. Затем создайте соединение с именем MQTT_V3_Publish
, снова с установленной версией MQTT 3.1.1, и опубликуйте два сообщения QoS 1 в теме clean_session_false
после успешного подключения.
Затем выберите соединение MQTT_V3 и нажмите кнопку Connect
, чтобы подключиться к серверу. Вы успешно получите два сообщения, которые были опубликованы в течение автономного периода.
Улучшения сеанса в 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.