Высокодоступные приложения периферийного уровня для операций Интернета вещей Azure

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

В следующих разделах описываются параметры и функции, которые способствуют надежной, нулевой потере сообщений и распределенного приложения.

Качество обслуживания (QoS)

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

Тип сеанса и флаг "Чистый сеанс"

Чтобы убедиться, что при подключении к брокеру MQTT установите флажок "чистый запуск " значение false. Этот параметр сообщает брокеру о сохранении состояния сеанса для клиента, сохранении подписок и ненавиденных сообщений между подключениями. Если клиент отключается, а затем повторно подключается, он возобновляется, когда он остался, получая любые ненавиденные сообщения QoS-1 через повторную попытку доставки сообщений. При настройке брокер MQTT истекает срок действия сеанса клиента, если клиент не будет повторно подключаться в течение интервала истечения срока действия сеанса, значение по умолчанию равно одному дню.

Получение max в многопоточных приложениях

Многопоточные приложения должны использовать максимальное значение получения (65 535 макс.) для параллельной обработки сообщений и применения управления потоками. Этот параметр оптимизирует обработку сообщений, позволяя нескольким потокам одновременно работать над сообщениями и без перегрузки приложения брокером с высокой скоростью сообщения выше емкости приложения. Каждый поток может обрабатывать сообщение независимо и отправлять его подтверждение после завершения. Обычно рекомендуется настроить максимальное получение пропорционально количеству потоков, которые использует приложение.

Подтверждение сообщений

Когда приложение подписчика отправляет подтверждение для сообщения QoS-1, оно берет на себя ответственность за сообщение. Получив подтверждение для сообщения QoS-1, брокер MQTT перестает отслеживать сообщение для этого приложения и раздела. Правильная передача владения обеспечивает сохранение сообщений в случае проблем обработки или сбоя приложения. Если приложение хочет защитить его от сбоя приложения, приложение не должно иметь права владения, прежде чем успешно завершить обработку этого сообщения. Приложения, подписывающиеся на брокер MQTT, должны отложить подтверждение сообщений до тех пор, пока обработка не завершится до получения максимального значения с максимальным значением не более 65 535. Это может включать ретрансляцию сообщения или производный от сообщения брокер MQTT для дальнейшей отправки.

Поведение хранения сообщений и брокера

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

Сохраненные сообщения

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

Keep-Alive

Чтобы обеспечить высокий уровень доступности в случае ошибок подключения или удаления, задайте подходящие интервалы поддержания активности для обмена данными с клиентским сервером. Во время простоя клиенты отправляют PINGREQs, ожидая PINGRESPs. Если ответа нет, реализуйте логику автоматического повторного подключения в клиенте для повторного установления подключений. Большинство клиентов, таких как Paho , имеют встроенную логику повторных попыток. Так как брокер MQTT является отказоустойчивым, повторное подключение завершается успешно, если есть по крайней мере два здоровых экземпляра брокера интерфейс и серверная часть.

Итоговая согласованность с подпиской QoS-1

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

Общие подписки

Общие подписки обеспечивают балансировку нагрузки между несколькими экземплярами высокодоступного приложения. Вместо каждого подписчика, получающего копию каждого сообщения, сообщения распределяются равномерно между подписчиками. Брокер MQTT в настоящее время поддерживает только алгоритм циклического перебора для распространения сообщений, позволяющих приложению масштабироваться. Типичным вариантом использования является развертывание нескольких модулей pod с помощью Kubernetes ReplicaSet, которые все подписываются на брокер MQTT с использованием одного фильтра разделов в общей подписке.

Государственный магазин (if referring to a government-owned retail store)

Хранилище состояний — это реплицированный хэш-файл в памяти для управления состоянием обработки приложения. В отличие от etcd, например, хранилище состояний определяет высокую скорость пропускной способности, горизонтальное масштабирование и низкую задержку с помощью структур данных в памяти, секционирования и репликации цепочки. Это позволяет приложениям использовать распределенную природу и отказоустойчивость для приложений при быстром доступе к согласованному состоянию между экземплярами. Чтобы использовать встроенное хранилище значений ключей, предоставленное распределенным брокером:

  • Реализуйте временные операции хранения и извлечения с помощью API хранилища ключей брокера, обеспечивая правильную обработку ошибок и согласованность данных. Эфемерное состояние — это кратковременное хранилище данных, используемое в обработке с отслеживанием состояния для быстрого доступа к промежуточным результатам или метаданным во время вычислений в режиме реального времени. В контексте приложения высокой доступности эфемерное состояние помогает восстановить состояния приложения между сбоями. Он может быть записан на диск, но остается временным, в отличие от архивного хранилища, предназначенного для долгосрочного хранения данных, к которым редко обращаются.

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

Контрольный список для разработки высокодоступного приложения

  • Выберите соответствующую клиентную библиотеку MQTT для языка программирования. Клиент должен поддерживать MQTT версии 5. Используйте библиотеку на основе C или Rust, если приложение учитывает задержку.
  • Настройте клиентную библиотеку для подключения к брокеру MQTT с и требуемым уровнем качества обслуживания (QoS-1).
  • Определите подходящее значение для интервалов истечения срока действия сеанса, истечения срока действия сообщения и поддержания активности.
  • Реализуйте логику обработки сообщений для приложения подписчика, включая отправку подтверждения, когда сообщение успешно доставлено или обработано.
  • Для многопоточных приложений настройте параметр max-receive , чтобы включить параллельную обработку сообщений.
  • Используйте сохраненные сообщения для сохранения временного состояния приложения.
  • Используйте распределенное хранилище состояний для управления эфемерным состоянием приложения.
  • Реализуйте общие подписки для равномерного распределения сообщений между несколькими экземплярами приложения, что позволяет эффективно масштабировать.