[Перевод] Сравнение популярных брокеров MQTT с открытым исходным кодом

Введение

Примечание: данная статья является переводом с дополнительными мыслями автора

MQTT (Message Queue Telemetry Transport) — легковесный протокол обмена сообщениями для публикации/подписки сообщений, на настоящий момент этот протокол является основным стандартом в Интернете Вещей (IoT). Брокер MQTT — главный узел (серверное ПО) для подключения IoT устройств и обмену сообщений между ними. На текущий момент доступно более 20 брокеров MQTT с исходным кодом, что затрудняет выбор архитекторами и разработчиками программного обеспечения. В статье будут рассмотрены и сравнены некоторые из самых популярный MQTT-брокеров.

Диаграмма взаимодействия с брокером 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 узлов.

b85e9634063ee736f55934678e424f54.png

EMQX также предлагает расширенные корпоративные функции, размещение в облачном хостинге, платную поддержку от компании EMQ Technologies Inc. EMQX завоевал популярность среди различных предприятий, стартапов и частных пользователей благодаря своей высокой производительности, масштабируемости и высокой надёжности. Он распространён среди критически важных для бизнеса отраслях, в таких как Индустриальный Интернет Вещей (Industry IoT), умный дом, автомобильная отрасль, производственные предприятия, телекоммуникации.

Официальный сайт проекта:  https://www.emqx.io /

GitHub:  https://github.com/emqx/emqx

Достоинства брокера EMQX:

  • Поддерживает крупномасштабные развертывания

  • Высокая доступность

  • Горизонтальная масштабируемость

  • Высокая производительность и низкая задержка

  • Богатые корпоративные возможности

  • Поддержка протокола MQTT over QUIC

Недостатки:

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.

Вариант взаимодействия с брокером MQTT

Вариант взаимодействия с брокером MQTT

Официальный сайт проекта:  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).

Примечание: автором проверена сборка и функционирование на компьютерах с процессорами Эльбрус.

Вариант развёртывания NanoMQ

Вариант развёртывания NanoMQ

Официальный сайт проекта:  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/½ в секунду может отправлять и доставлять брокер;

  • Задержка: насколько быстро брокер может отправлять и доставлять сообщения 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.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

© Habrahabr.ru