Введение
Примечание: данная статья является переводом с дополнительными мыслями автора
MQTT (Message Queue Telemetry Transport) — легковесный протокол обмена сообщениями для публикации/подписки сообщений, на настоящий момент этот протокол является основным стандартом в Интернете Вещей (IoT). Брокер MQTT — главный узел (серверное ПО) для подключения IoT устройств и обмену сообщений между ними. На текущий момент доступно более 20 брокеров MQTT с исходным кодом, что затрудняет выбор архитекторами и разработчиками программного обеспечения. В статье будут рассмотрены и сравнены некоторые из самых популярный MQTT-брокеров.
Критерий оценки: сообщество и популярность
Для сравнения MQTT брокеров с открытым исходным кодом будем учитывать следующие критерии оценки:
-
Сообщество: оцениваем по количеству звёздочек, числу авторов и закрытых проблем в репозиториях GItHub (или другой площадке);
-
Популярность: оцениваем по числу скачиваний из репозитория, пользовательской базе и числу установок из docker репозитория;
-
Активность: оценка по числу коммитов, пулл-реквестов и релизов за последние 12 месяцев.
Основываясь на этих критериях, были выбраны четыре популярных брокера MQTT с открытым исходным кодом:
-
EMQX — самый популярный брокер MQTT с 11,4 тысячами звёзд на GitHub;
-
Mosquitto — второй по популярности брокер, имеет самое большое число установок и пользователей:
-
NanoMQ — новейший и набирающий популярность брокер MQTT, очень легковесный, переносимый и написан на языке C;
-
VerneMQ — третий по количеству звёзд брокер MQTT на GitHub.
Сводная таблица сравнения этих брокеров:
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
GitHub |
||||
|
Создан проект |
2012 |
2009 |
2020 |
2014 |
|
Лицензия |
Apache версии 2.0 |
Лицензия EPL / EDL |
MIT License |
Apache версии 2.0 |
|
Язык программирования |
Erlang |
C / C ++ |
C |
Erlang |
|
Последняя версия |
версия 5.0.23 (апрель 2023) |
2.0.15 (август 2022) |
версия 0.17.0 (март 2023) |
версия 1.12.6.2 (ноябрь 2022) |
|
Звезд на GitHub |
11.5k |
7.2k |
800+ |
3k |
|
Общее число коммитов |
14k+ |
2800+ |
2000+ |
2400+ |
|
Число коммитов за последние 12 месяцев |
3000+ |
500+ |
1200+ |
50+ |
|
Закрытых проблем на GitHub |
3500+ |
2200+ |
120+ |
1300+ |
|
Релизов |
260+ |
60+ |
75+ |
40 |
|
Количество PR |
6000+ |
600 |
780+ |
600 |
|
Количество авторов на GitHub |
100+ |
110+ |
20+ |
50 |
Приступаем к сравнению
EMQX
EMQX — является одним из самых популярных брокеров MQTT и имеет 11,5 тыс. звезд на GitHub. Проект EMQX был запущен в 2012 году и распространяется по лицензии Apache 2.0. EMQX написан на языке Erlang / OTP, том самом знаменитом языке программирования для создания масштабируемых программных систем реального времени.
EMQX — самый масштабируемый в мире брокер MQTT на кластерной основе, который поддерживает расширяемость с помощью плагинов, использует протоколы MQTT 3.1, MQTT 5.0, MQTT-SN и MQTT поверх QUIC. Он поддерживает кластеризацию без мастера для обеспечения высокой доступности и горизонтальной масштабируемости. EMQX 5.0, последняя версия, может обслуживать до 100 миллионов одновременных подключений MQTT только с помощью одного кластера состоящего из 23 узлов.

EMQX также предлагает расширенные корпоративные функции, размещение в облачном хостинге, платную поддержку от компании EMQ Technologies Inc. EMQX завоевал популярность среди различных предприятий, стартапов и частных пользователей благодаря своей высокой производительности, масштабируемости и высокой надёжности. Он распространён среди критически важных для бизнеса отраслях, в таких как Индустриальный Интернет Вещей (Industry IoT), умный дом, автомобильная отрасль, производственные предприятия, телекоммуникации.
Официальный сайт проекта: https://www.emqx.io /
GitHub: https://github.com/emqx/emqx
Достоинства брокера EMQX:
-
Поддерживает крупномасштабные развертывания
-
Высокая доступность
-
Горизонтальная масштабируемость
-
Высокая производительность и низкая задержка
-
Богатые корпоративные возможности
-
Поддержка протокола MQTT over QUIC
Недостатки:
-
Сложный в настройке
-
Сложно эффективно управлять (требуется DevOPS)
Mosquitto
Проект Mosquitto разработан Роджером Лайтом в 2009 году, а позже передан на поддержку в Eclipse Foundation, имеет лицензию Eclipse (EPL / EDL license). По состоянию на март 2023 года это самый широко распространенный брокер MQTT с открытым исходным кодом и с большим сообществом и более чем 7 тыс. звезд на GitHub.
Mosquitto написан на языках программирования C / C ++ и использует однопоточную архитектуру (это его главный недостаток). Mosquitto реализует протоколы MQTT версий 5.0, 3.1.1 и 3.1 и поддерживает защищённые соединения SSL / TLS и поддержку веб сокетов. Легкий дизайн Mosquitto делает его подходящим для развертывания во встраиваемых системах или на серверах с ограниченными ресурсами.
Mosquitto имеет небольшой размер около 200 кб. Однако он не поддерживает многопоточность и тем более нет возможности развёртывания на кластере, но Mosquitto доступен для различных платформ, включая Linux, FreeBSD, Windows и macOS.
Официальный сайт проекта: https://mosquitto.org /
Исходный код на GitHub: https://github.com/eclipse/mosquitto
Достоинства:
-
Простота настройки и использования
-
Поддержка протокола MQTT 5.0
-
Легковесный, малое потребление памяти
-
Активная поддержка сообществом
Недостатки:
-
Однопоточная архитектура
-
Ограниченная масштабируемость в продакшне ( <100 тыс.)
-
Нет поддержки кластеризации
-
Отсутствуют корпоративные функции
-
Ограниченная поддержка в облаке
NanoMQ
NanoMQ, проект с открытым исходным кодом, выпущенный в 2020 году, представляет собой легкий и быстрый брокер MQTT, разработанный для вычислительных сценариев Интернете вещей (IoT).
NanoMQ реализован полностью на языке C, использует библиотеку асинхронного программирования NNG и с многопоточной акторной моделью. Брокер полностью поддерживает версии протоколов MQTT 3.1.1, MQTT 5.0 и поддерживает MQTT over QUIC.
NanoMQ отличается малым размером и высокой производительностью, что делает его подходящим для различных периферийных вычислительных платформ (Edge). Он обладает высокой совместимостью и переносимостью, использует исключительно стек POSIX API. Это упрощает развертывание на любой платформе, совместимой с POSIX (Linux, *BSD, MacOS X), и бесперебойно работает на различных архитектурах процессоров, включая x86_64, ARM, MIPS и RISC-V (теперь ещё и E2K).
Примечание: автором проверена сборка и функционирование на компьютерах с процессорами Эльбрус.
Официальный сайт проекта: https://nanomq.io /
Исходный код на GitHub: https://github.com/nanomq/nanomq
Достоинства
-
Простая архитектура
-
Поддержка многопоточности и асинхронного ввода-вывод
-
Высокая переносимость
-
Малый объем загрузки
-
Простота развертывания
-
Поддержка сетевых мостов без посредников
Недостатки
-
Нет поддержки кластеризации
-
Небольшое сообщество и база пользователей
-
Отсутствие документации и руководств
-
Отсутствие корпоративных функций (интеграция данных)
VerneMQ
Проект VerneMQ был запущен в 2014 году и изначально разработан Erlio GmbH. Проект распространяется по лицензии Apache версии 2.0. Он поддерживает MQTT версий 3.1, 3.1.1 и 5.0. Написан на языке Erlang / OTP, и заимствует некоторый код из проекта EMQX.
Что касается архитектурного дизайна, VerneMQ предназначен для обработки миллионов одновременных подключений и сообщений с низкой задержкой и высокой пропускной способностью. Он поддерживает хранение сообщений MQTT в LevelDB и использует архитектуру кластеризации, основанную на библиотеке Plumtree, которая реализует алгоритм деревьев рассылки Epidemic.
К сожалению, кластерная архитектура Plumtree не доказала свою эффективность, хотя теоретически она казалась идеальной. Команда и сообщество VerneMQ потратили много лет, пытаясь заставить его работать, устраняя такие проблемы, как разделение сети, несогласованность данных и аварийное восстановление.
Наконец, проект перестал активно разрабатываться и поддерживаться, за последние 12 месяцев было зафиксировано всего около 50 коммитов.
Официальный сайт проекта: https://www.vernemq.com /
GitHub репозиторий: https://github.com/vernemq/vernemq
Достоинства:
-
Высокая доступность
-
Горизонтальная масштабируемость
-
Сохранение сообщений
Недостатки:
-
Не проверенная кластеризация
-
Ограниченная документация
-
Ограниченные возможности предприятия
-
Не активно развивается
Масштабируемость, производительность и надежность
Критерии оценки масштабируемости, надёжности и производительности:
-
Масштабируемость: может ли брокер масштабироваться горизонтально для обработки миллионов одновременных подключений MQTT
-
Доступность: Поддерживает ли брокер высокую доступность для критически важных приложений
-
Производительность: сколько сообщений MQTT в режимах QoS 0/1/2 в секунду может отправлять и доставлять брокер;
-
Задержка: насколько быстро брокер может отправлять и доставлять сообщения MQTT от одного клиента MQTT другому
-
Надежность: поддерживает ли брокер сохранение и доставку сообщений MQTT без потери данных
Ниже приведен краткий анализ четырех брокеров MQTT:
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
Масштабируемость |
|
|
|
|
|
Многопоточность |
ДА |
НЕТ |
ДА |
ДА |
|
Асинхронный ввод-вывод |
ДА |
ДА |
ДА |
ДА |
|
Кластеризация |
Да (кластер из более чем 20 узлов) |
НЕТ |
НЕТ |
ДА |
|
Соединения MQTT на 1 узел |
4 млн. |
100 тыс. |
100 тыс. |
1 млн |
|
Подключения MQTT на весь кластер |
100 млн. |
— |
— |
? |
|
Доступность |
|
|
|
|
|
Архитектура кластеризации без мастера |
ДА |
НЕТ |
НЕТ |
ДА |
|
Эластичное масштабирование во время выполнения |
ДА |
НЕТ |
НЕТ |
ДА |
|
Автоматическая кластеризация |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Защита от перегрузки |
ДА |
НЕТ |
НЕТ |
ДА |
|
Отказоустойчивость |
ДА |
НЕТ |
НЕТ |
? |
|
Производительность (на узел) |
|
|
|
|
|
Режим QoS0 (сообщений / сек.) |
2 миллиона |
120k |
500k |
? |
|
Режим QoS1 (сообщений / сек.) |
800k |
80k |
400k |
? |
|
Режим QoS2 (сообщений / сек.) |
200k |
40k |
200k |
? |
|
Задержка |
|
|
|
|
|
Задержка (зависит от разных сценариев) |
Однозначная задержка в миллисекундном масштабе |
Задержка до нескольких секунд в некоторых сценариях |
В большинстве сценариев менее 10 миллисекунд |
Задержка до нескольких секунд в некоторых сценариях |
|
Надежность |
|
|
|
|
|
Сохранение сообщений |
В RocksDB и внешних базах данных |
В файлах |
В SQLite |
В LevelDB |
|
Нулевое время простоя / Горячее обновление |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Горячий патч |
ДА |
НЕТ |
НЕТ |
НЕТ |
Протокол MQTT и способы соединения
Все представленные брокеры полностью реализуют протокол MQTT версий 3.1.1 и 5.0 и поддерживают MQTT через WebSocket и шифрование с SSL/ TLS. Кроме того, EMQX поддерживает шлюзы протоколов MQTT-SN, CoAP и LwM2M. NanoMQ поддерживает режим без брокеров и может работать с DDS, ZeroMQ и Nanomsg.
EMQX и NanoMQ взяли на себя обязательство продвигать стандарт MQTT over QUIC. Они являются пионерами в реализации MQTT over QUIC, протокола MQTT следующего поколения, который направлен на дальнейшую оптимизацию взаимодействия IoT.
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
MQTT 3.1/3.1.1 |
ДА |
ДА |
ДА |
ДА |
|
MQTT 5.0 |
ДА |
ДА |
ДА |
ДА |
|
MQTT-SN 1.2 |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
MQTT через TCP |
ДА |
ДА |
ДА |
ДА |
|
MQTT через SSL / TLS |
ДА |
ДА |
ДА |
ДА |
|
MQTT через WebSocket |
ДА |
ДА |
ДА |
ДА |
|
MQTT по сравнению с QUIC |
ДА |
НЕТ |
ДА |
НЕТ |
|
Объединение MQTT |
ДА |
ДА |
ДА |
ДА |
|
Общая подписка |
ДА |
ДА |
ДА |
ДА |
|
Сохраненное сообщение |
ДА |
ДА |
ДА |
ДА |
|
ДА |
ДА |
ДА |
ДА |
|
|
ДА |
ДА |
ДА |
ДА |
|
|
LB (прокси-протокол) |
ДА |
НЕТ |
НЕТ |
ДА |
|
Мультипротоколный шлюз |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
CoAP |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
LwM2M |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Шлюз DDS |
НЕТ |
НЕТ |
ДА |
НЕТ |
|
Шлюз ZeroMQ |
НЕТ |
НЕТ |
ДА |
НЕТ |
|
Nanomsg/NNG |
НЕТ |
НЕТ |
ДА |
НЕТ |
Безопасность, аутентификация и авторизация
Безопасность имеет решающее значение для подключения устройств Интернета вещей и обмена данными между подключенными устройствами с использованием брокеров MQTT (основные уязвимости в IoT связаны с отсутствием аутентификации и авторизации). Все сравниваемые брокеры поддерживают безопасные соединения на основе протокола TLS / SSL, а также простой механизм аутентификации и авторизации по логину и паролю, аутентификацию по JWT, сертификаты X.509 и спискам контроля доступа.
EMQX предлагает расширенные функции безопасности, такие как интеграция с внешними базами данных (хранение аккаунтов), OCSP, политики контроля доступа, обнаружение сбоев и поддержка авторизации по протоколу OAuth 2.0.
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
TLS/SSL |
Yes |
Yes |
Yes |
Yes |
|
Сшивание OCSP |
ДА |
ДА |
НЕТ |
НЕТ |
|
Аутентификация по имени пользователя / паролю |
ДА |
ДА |
ДА |
ДА |
|
Аутентификация по сертификатам X.509 |
ДА |
ДА |
ДА |
ДА |
|
Аутентификация JWT |
ДА |
Да (через плагин аутентификации) |
НЕТ |
? |
|
Аутентификация LDAP |
ДА |
Да (через плагин аутентификации) |
НЕТ |
Да (через плагин) |
|
Детализированный контроль доступа |
ДА |
ДА |
ДА |
ДА |
|
Авторизация с использованием баз данных |
Да (встроенный) |
Да (через плагины аутентификации) |
НЕТ |
Да (через плагины аутентификации) |
|
Обнаружение взмахов |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Журналы аудита |
ДА |
НЕТ |
НЕТ |
НЕТ |
Интеграция с хранилищами данных
Все брокеры поддерживают интеграцию с внешними сервисами с использованием REST API и веб-хуки. Как легковесные брокеры, Mosquitto и NanoMQ не поддерживают интеграцию с хранилищами данных. Разработчики могут писать код с использованием брокера Mosquitto и самим передавать их во внешние базы данных или облачные сервисы.
EMQX реализует встроенный механизм правил на основе SQL, помогающий извлекать, фильтровать, обогащать и преобразовывать сообщения MQTT в брокере в режиме реального времени. И корпоративной версии EMQX могут легко интегрироваться с Kafka, базами данных и облачными сервисами с использованием готовых мостов передачи данных.
Таблица сравнения с поддерживаемыми провайдерами хранения данных:
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
Веб-хуки |
ДА |
ДА |
ДА |
ДА |
|
Механизм правил |
ДА |
НЕТ |
Да (ограничено) |
НЕТ |
|
Кодирование сообщений |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Реестр схем (моделей данных) |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Поддержка сетевого моста |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Confluent/Kafka |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
SAP Event Mesh |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
Apache Pulsar |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
RabbitMQ |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
MySQL |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
PostgreSQL |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
SQL Server |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
MongoDB |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
AWS DynamoDB |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
ClickHouse |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
InfluxDB |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
TimescaleDB |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
Oracle |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
Redis |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
|
Cassandra |
Да (Корпоративная версия) |
НЕТ |
НЕТ |
НЕТ |
Работоспособность, мониторинг и совместимость
Каждый брокер удобен в использовании и оснащен необходимыми функциями ведения журнала и отладки для мониторинга их состояния и эффективного устранения неполадок. Они могут работать в различных операционных системах и общедоступных облачных платформах. Кроме того, EMQX обладает отличной поддержкой Kubernetes Operator и Terraform.
Кроме того, EMQX предоставляет широкие возможности визуального мониторинга через HTTP API и панель мониторинга, упрощая мониторинг и управление. Кроме того, EMQX поддерживает интеграцию с Prometheus и Grafana, позволяя командам легко использовать платформы мониторинга сторонних производителей.
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
Информационная панель |
ДА |
НЕТ |
НЕТ |
НЕТ |
|
Конфигуратор |
Формат HOCON |
Формат Ключ-значение |
Формат HOCON |
Формат Ключ-значение |
|
Горячее обновление конфигурации |
ДА |
НЕТ |
Да (Ограничено) |
НЕТ |
|
REST API |
ДА |
ДА |
ДА |
ДА |
|
Утилиты командной строки (cli) |
ДА |
ДА |
ДА |
ДА |
|
Удаленная консоль |
ДА |
НЕТ |
НЕТ |
ДА |
|
Метрики |
ДА |
ДА |
ДА |
ДА |
|
Интеграция с Grafana |
ДА |
ДА |
ДА |
ДА |
|
Мониторинг Prometheus |
ДА |
ДА |
ДА |
ДА |
|
Контейнеры Docker |
ДА |
ДА |
ДА |
ДА |
|
Kubernetes |
Да (EMQX Kubernetes) |
НЕТ |
НЕТ |
НЕТ |
|
Terraform |
Да (EMQX Terraform) |
НЕТ |
НЕТ |
НЕТ |
Финальное сравнение
Сводная таблица сравниваемых брокеров MQTT по всем критериям:
|
|
EMQX |
Mosquitto |
NanoMQ |
VerneMQ |
|
Масштабируемость |
Отлично |
Умеренно |
Хорошо |
Хорошо |
|
Доступность |
Отлично |
Умеренно |
Умеренно |
Хорошо |
|
Производительность |
Отлично |
Отлично |
Отлично |
Хорошо |
|
Задержка (latency) |
Отлично |
Хорошо |
Отлично |
Хорошо |
|
Надежность |
Хорошо |
Хорошо |
Хорошо |
Умеренно |
|
Безопасность |
Отлично |
Отлично |
Хорошо |
Хорошо |
|
Аутентификация и авторизация |
Отлично |
Хорошо |
Умеренно |
Хорошо |
|
Возможность подключения |
Отлично |
Хорошо |
Хорошо |
Хорошо |
|
Интеграция |
Отлично |
Умеренно |
Умеренно |
Умеренно |
|
Работоспособность |
Хорошо |
Отлично |
Хорошо |
Умеренно |
|
Мониторинг |
Отлично |
Умеренно |
Умеренно |
Хорошо |
|
Совместимость |
Хорошо |
Отлично |
Отлично |
Хорошо |
|
Простота использования |
Хорошо |
Отлично |
Хорошо |
Хорошо |
|
Поддержка сообществом |
Отлично |
Отлично |
Хорошо |
Умеренно |
Заключение
За последнее десятилетие брокеры MQTT с открытым исходным стали основным инструментом для построения Интернета вещей. Эти брокеры сыграли значительную роль в улучшении функциональности, масштабируемости и переносимости протокола обмена сообщениями MQTT. Без этого вклада MQTT, возможно, не стал бы таким широко распространенным и универсальным, как сегодня.
Выбор брокера MQTT зависит от различных факторов, таких как количество подключенных устройств, пропускная способность сообщений и требования к интеграции. Из сравнения мы можем сделать вывод, что EMQX — это высокомасштабируемый брокер корпоративного уровня для крупномасштабных критически важных развертываний в облаке. Mosquitto и NanoMQ быстрые и легкие, что делает их подходящими для развертывания на встраиваемом оборудовании с ограниченными ресурсами, промышленных шлюзах и Edge- серверах Интернета вещей.
Будущее IoT
C быстрым расширением Интернета вещей количество подключенных устройств, по различным прогнозам, превысит 100 миллиардов к 2030 году. В результате протокол MQTT может стать еще более незаменимым и потенциально может стать нервной системой Интернета вещей.
В настоящее время в разработке находится несколько технологий, такие как MQTT over QUIC, MQTT Serverless, MQTT Unified Namespace и многие другие.
Ссылки
[2] Comparsion of MQTT implementations
[3] Stress-Testing MQTT Brokers: A Comparative Analysis of Performance Measurements
ссылка на оригинал статьи https://habr.com/ru/articles/782644/
Добавить комментарий