Разработка высокодоступных приложений с помощью брокера MQTT
Создание высокодоступного приложения с помощью брокера 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 с использованием одного фильтра разделов в общей подписке.
Хранилище состояний
Хранилище состояний — это реплицированный хэш-файл в памяти для управления состоянием обработки приложения. В отличие от etcd, например, хранилище состояний определяет высокую скорость пропускной способности, горизонтальное масштабирование и низкую задержку с помощью структур данных в памяти, секционирования и репликации цепочки. Это позволяет приложениям использовать распределенную природу и отказоустойчивость для приложений при быстром доступе к согласованному состоянию между экземплярами. Чтобы использовать встроенное хранилище key-value, предоставленное распределенным брокером:
Реализуйте временные операции хранения и извлечения с помощью API хранилища ключей брокера, обеспечивая правильную обработку ошибок и согласованность данных. Эфемерное состояние — это кратковременное хранилище данных, используемое в обработке с отслеживанием состояния для быстрого доступа к промежуточным результатам или метаданным во время вычислений в режиме реального времени. В контексте приложения высокой доступности эфемерное состояние помогает восстановить состояния приложения между сбоями. Он может быть записан на диск, но остается временным, а не холодным хранилищем, предназначенным для долгосрочного хранения редко доступных данных.
Используйте хранилище состояний для совместного использования состояния, кэширования, конфигурации или других важных данных среди нескольких экземпляров приложения, что позволяет им обеспечить согласованное представление данных.
Использование встроенной интеграции dapr брокера MQTT
Для более простых вариантов использования приложение может использовать Dapr (распределенная среда выполнения приложений). Dapr — это переносимая, переносимая среда выполнения на основе событий, которая упрощает создание микрослужб и распределенных приложений. Он предлагает набор стандартных блоков, таких как вызов между службами, управление состоянием и публикация и подписка на обмен сообщениями.
Dapr предлагается в рамках брокера MQTT, абстрагирования сведений об управлении сеансами MQTT, ответе QoS и подтверждении, а также встроенных хранилищах ключевых значений, что делает его практическим выбором для разработки высокодоступного приложения для простых вариантов использования:
Создайте приложение с помощью стандартных блоков Dapr, таких как управление состоянием для обработки хранилища ключей и публикации и подписки для взаимодействия с брокером MQTT. Если в случае использования требуются стандартные блоки и абстракции, которые не поддерживаются Dapr, рассмотрите возможность использования описанных выше функций брокера MQTT.
Реализуйте приложение с помощью предпочитаемого языка программирования и платформы, используя пакеты SDK dapr или API для простой интеграции с брокером и хранилищем ключей-значением.
Контрольный список для разработки высокодоступного приложения
- Выберите соответствующую клиентную библиотеку MQTT для языка программирования. Клиент должен поддерживать MQTT версии 5. Используйте библиотеку на основе C или Rust, если приложение учитывает задержку.
- Настройте клиентную библиотеку для подключения к брокеру MQTT с установленным флагом
false
чистого сеанса и требуемым уровнем качества обслуживания (QoS-1). - Определите подходящее значение для интервалов истечения срока действия сеанса, истечения срока действия сообщения и поддержания активности.
- Реализуйте логику обработки сообщений для приложения подписчика, включая отправку подтверждения, когда сообщение успешно доставлено или обработано.
- Для многопоточных приложений настройте параметр max-receive , чтобы включить параллельную обработку сообщений.
- Используйте сохраненные сообщения для сохранения временного состояния приложения.
- Используйте распределенное хранилище состояний для управления эфемерным состоянием приложения.
- Оцените Dapr для разработки приложения, если вариант использования прост и не требует подробного контроля над подключением MQTT или обработкой сообщений.
- Реализуйте общие подписки для равномерного распределения сообщений между несколькими экземплярами приложения, что позволяет эффективно масштабировать.