Введение
Примечание: данная статья является переводом с дополнительными мыслями автора
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 | EMQX GitHub | Mosquitto на GitHub | NanoMQ на GitHub | 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 | ДА | ДА | ДА | ДА |
Общая подписка | ДА | ДА | ДА | ДА |
Сохраненное сообщение | ДА | ДА | ДА | ДА |
Будет сообщение | ДА | ДА | ДА | ДА |
Запрос / Ответ 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 и многие другие.
Ссылки
[1] Оригинал статьи
[2] Comparsion of MQTT implementations
[3] Stress-Testing MQTT Brokers: A Comparative Analysis of Performance Measurements
[4] https://github.com/krylovsk/mqtt-benchmark
[5] EntityFX MQS Simulator