Начало работы с MQTT через QUIC: краткое руководство по стандартному протоколу IoT следующего поколения
КОТОРЫЙRFC9000) является базовым транспортным протоколом интернет-протокола следующего поколения HTTP/3. По сравнению с протоколами TCP/TLS он обеспечивает эффективный и гибкий транспортный уровень для мобильного Интернета, который снижает нагрузку на сеть и задержку обмена сообщениями.
EMQX 5.0 — это первый инновационный продукт, который представляет QUIC для MQTT. Мы обнаружили, что функции QUIC идеально подходят для некоторых сценариев в IoT, когда мы поддерживали клиентов и разрабатывали технологии, поэтому мы попытались заменить транспортный уровень MQTT на QUIC, что привело к MQTT поверх QUIC.
Как описано в бывшая статья, QUIC обладает низкими сетевыми издержками и возможностью мультиплексирования, что дает ему большое преимущество в сценариях IoT, где сети нестабильны и соединения часто переключаются. Данные испытаний показывают, что MQTT поверх QUIC может эффективно повысить удобство работы пользователя в нестабильных сетях со слабыми сигналами и нестабильными соединениями благодаря способности QUIC выполнять повторное подключение 0 RTT/1 RTT/новое.
Как Основополагающий спонсор OASIS, всемирно известной организации с открытым исходным кодом и открытыми стандартами, EMQ активно поддерживает стандартизацию MQTT по сравнению с QUIC. Некоторые клиенты уже пытались использовать эту новую функцию, и мы получили хорошие отзывы. Эта статья поможет вам приступить к изучению функции MQTT Over QUIC в EMQX 5.0.
Включить MQTT через QUIC
MQTT через QUIC поддерживается начиная с EMQX 5.0. Загрузите и установите последнюю версию EMQX здесь:
Это экспериментальная функция. Для CentOS 6, macOS и Windows вам необходимо скомпилировать QUIC из исходного кода. Пожалуйста, установите BUILD_WITH_QUIC=1 во время компиляции.
MQTT через QUIC по умолчанию отключен. Вы можете включить его вручную, выполнив следующие действия.
- Откройте файл конфигурации etc/emqx.conf и раскомментируйте блок listeners.quic.default (добавьте его вручную, если он не существует):
# etc/emqx.conf
listeners.quic.default {
enabled = true
bind = "0.0.0.0:14567"
max_connections = 1024000
keyfile = "etc/certs/key.pem"
certfile = "etc/certs/cert.pem"
}
- Эта конфигурация включает прослушиватель QUIC на порту UDP 14567. После успешного сохранения перезапустите EMQX, чтобы активировать конфигурацию.
Вы также можете включить функцию QUIC с помощью env vars при запуске EMQX:
EMQX_LISTENERS __QUIC__ DEFAULT__keyfile="etc/certs/key.pem" \
EMQX_LISTENERS __QUIC__ DEFAULT__certfile="etc/certs/cert.pem" \
EMQX_LISTENERS __QUIC__ DEFAULT__ENABLED=true
- Использует команду слушателей emqx_ctl для просмотра состояния прослушивателя QUIC:
> emqx_ctl listeners
quic:default
listen_on : :14567
acceptors : 16
proxy_protocol : undefined
running : true
ssl:default
listen_on : 0.0.0.0:8883
acceptors : 16
proxy_protocol : false
running : true
current_conn : 0
max_conns : 512000
Вы также можете использовать Docker для быстрой работы, установив UDP-порт 14567 в качестве порта QUIC через переменную среды:
docker run -d --name emqx \
-p 1883:1883 -p 8083:8083 \
-p 8084:8084 -p 8883:8883 \
-p 18083:18083 \
-p 14567:14567/udp \
-e EMQX_LISTENERS __QUIC__ DEFAULT__keyfile="etc/certs/key.pem" \
-e EMQX_LISTENERS __QUIC__ DEFAULT__certfile="etc/certs/cert.pem" \
-e EMQX_LISTENERS __QUIC__ DEFAULT__ENABLED=true \
emqx/emqx:5.0.10
Клиенты и инструменты для MQTT через QUIC не являются полнофункциональными, как обычный клиент MQTT.
На основе сценариев, подходящих для MQTT, мы планируем предоставлять клиенты на нескольких языках, таких как C, Java, Python и Golang. Эти клиенты будут разрабатываться в приоритетном порядке, чтобы соответствующие сценарии, такие как встроенное оборудование, могли как можно быстрее воспользоваться преимуществами QUIC.
Доступные клиентские SDK
- НаноSDK: MQTT SDK на основе C, выпущенный командой NanoMQ в EMQ. Помимо MQTT через QUIC, он также поддерживает другие протоколы, такие как WebSocket и nanomsg/SP.
- NanoSDK-Python: привязка NanoSDK к Python.
- NanoSDK-Java: привязка Java JNA к NanoSDK.
- emqtt: клиентская библиотека MQTT, разработанная на Erlang, поддерживающая QUIC.
В дополнение к клиентской библиотеке EMQ предоставляет возможность соединения MQTT с QUIC в продукте граничных вычислений NanoMQ. NanoMQ можно использовать для передачи данных с периферии в облако через QUIC, чтобы можно было использовать MQTT поверх QUIC без кодирования.
Проблемы и решения
Многие операторы связи имеют специальные сетевые правила для пакетов из UDP, что может привести к сбою подключения к QUIC или отбрасыванию пакетов, поскольку QUIC основан на UDP.
Таким образом, клиент MQTT поверх QUIC разработан с возможностью отката: вы можете разрабатывать сервисы через унифицированные API, а транспортный уровень можно изменять в режиме реального времени в зависимости от состояния сети. Если QUIC недоступен, он автоматически переключается на TCP/TLS 1.2, чтобы обеспечить правильное использование служб в разных сетях.
Подключить MQTT через QUIC через NanoSDK
НаноSDK основан на проекте MsQuic. Это первый SDK для MQTT поверх QUIC на C, и он полностью совместим с EMQX 5.0. Ключевые особенности NanoSDK включают в себя: асинхронный ввод-вывод, сопоставление соединения MQTT с потоком QUIC, рукопожатие 0RTT с малой задержкой и параллельную обработку нескольких ядер.
Примеры NanoSDK
API следует тому же стилю, что и предыдущий. Создать клиент MQTT на основе QUIC можно одной строкой кода:
## Create MQTT over Quic client with NanoSDK
nng_mqtt_quic_client_open(&socket, url);
Пример кода см. по адресу: https://github.com/nanomq/NanoSDK/tree/main/demo/quic.
После завершения компиляции вы сможете запустить приведенную ниже команду, чтобы подключиться к порту 14567 для тестирования.
quic_client sub/pub mqtt-quic://54.75.171.11:14567 topic msg
NanoSDK также обеспечивает привязку Java и Python. Для примеров см.: MqttQuicClient.java и mqttsub.py.
Мост MQTT 3.1.1/5.0 и MQTT через QUIC через NanoMQ
НаноМК — это сверхлегкий, высокопроизводительный и кроссплатформенный брокер MQTT для периферии IoT. Его можно использовать в качестве шины сообщений для многих протоколов, и он может соединять MQTT и MQTT через QUIC. Он передает пакеты MQTT по протоколу QUIC, которые отправляются на EMQX в облаке. Таким образом, пограничные устройства, которые не могут быть интегрированы с MQTT через QUIC SDK или не могут найти соответствующий MQTT через QUIC SDK, а также встроенные устройства, прошивку которых нельзя изменить, могут использовать преимущества протокола QUIC в сценариях IoT. Это будет очень удобно для пользователя.
Поскольку NanoMQ может обрабатывать множество протоколов, он очень полезен в сценариях IoT, где данные синхронизируются с облачными службами. Его можно использовать в качестве шины сообщений и системы хранения для распространенных протоколов обмена сообщениями через брокера и без брокера, таких как HTTP, MQTT 3.1.1/5.0, WebSocket, nanomsg/nng и ZeroMQ. «Актор» NanoMQ, мощная и встроенная модель обработки сообщений, преобразует данные этих протоколов в стандартные сообщения из протокола MQTT, и они отправляются в Облако через QUIC.
Это полностью использует возможности MQTT через QUIC, такие как быстрое переподключение 0RTT и пассивное переключение адресов, для решения общих проблем в соединении IoT, таких как сетевой роуминг, слабая передача сетей и блокировка очереди ПТС. Вы также можете перенаправлять, кэшировать или сохранять данные с помощью Rule Engine NanoMQ.
Благодаря архитектуре обмена сообщениями Cloud-Edge EMQX+NanoMQ пользователи могут быстро и дешево собирать и синхронизировать данные в любое время и в любом месте в сценариях Pan IoT.
Стоит отметить, что NanoMQ может автоматически переключаться на стандартный MQTT через TCP/TLS при сбое соединения QUIC, чтобы сетевое окружение не повлияло на ваше устройство.
Пример моста NanoMQ
Загрузите и установите NanoMQ:
git clone
cd nanomq ; git submodule update --init --recursive
mkdir build && cd build
cmake -G Ninja -DNNG_ENABLE_QUIC=ON ..
sudo ninja install
После компиляции и установки NanoMQ, поддерживающего QUIC, вы можете настроить MQTT поверх QUIC и связанные темы в файле конфигурации /etc/nanomq.conf. Использование mqtt-quic в качестве префикса URL означает использование QUIC в качестве транспортного уровня для MQTT:
## Bridge address: host:port .
##
## Value: String
## Example: ## Example: mqtt-tcp://broker.emqx.io:1883 (This is standard MQTT over TCP)
bridge.mqtt.emqx.address=mqtt-quic://54.75.171.11:14567
NanoMQ также предоставляет nanomq_cli, который содержит клиентские инструменты для MQTT через QUIC, чтобы пользователи могли тестировать MQTT через QUIC EMQX 5.0:
nanomq_cli quic --help
Usage: quic conn <url>
quic sub <url> <qos> <topic>
quic pub <url> <qos> <topic> <data>
## subscribe example
nanomq_cli quic sub mqtt-quic://54.75.171.11:14567 2 msg
В заключение, вы можете интегрировать NanoSDK непосредственно в свои проекты или использовать клиентские инструменты, оба из которых могут подключать устройства к облаку через QUIC.
Используйте emqtt-bench для тестирования производительности QUIC
emqtt-скамейка это инструмент для тестирования производительности MQTT, который поддерживает QUIC. Мы использовали его для проведения теста производительности MQTT через QUIC против TCP/TLS. Его можно использовать для тестирования приложений или проверки производительности и преимуществ MQTT по сравнению с QUIC в реальных условиях.
Скомпилируйте emqtt-bench
Для компиляции требуется Erlang. Возьмем, к примеру, macOS для установки Erlang и Coreutils:
brew install coreutils
brew install erlang@24
Скомпилируйте emqtt-bench из исходников
git clone
cd emqtt-bench
CMAKE_BUILD_TYPE=Debug BUILD_WITH_QUIC=1 make
Следующие подсказки отображаются для успешной компиляции:
...
===> Warnings generating release:
*WARNING* Missing application sasl. Can not upgrade with this release
===> Release successfully assembled: _build/emqtt_bench/rel/emqtt_bench
===> Building release tarball emqtt_bench-0.3+build.193.ref249f7f8.tar.gz...
===> Tarball successfully created: _build/emqtt_bench/rel/emqtt_bench/emqtt_bench-0.3+build.193.ref249f7f8.tar.gz
Могут возникнуть следующие ошибки, которые можно игнорировать:
/Users/patilso/emqtt-bench/scripts/rename-package.sh: line 9: gsed: command not found
/Users/patilso/emqtt-bench/scripts/rename-package.sh: line 9: gsed: command not found
/Users/patilso/emqtt-bench/scripts/rename-package.sh: line 9: gsed: command not found
/Users/patilso/emqtt-bench/scripts/rename-package.sh: line 9: gsed: command not found
Тест QUIC
Перейдите в выходной каталог компиляции:
cd _build/emqtt_bench/rel/emqtt_bench/bin
Вы можете использовать QUIC через опцию —quic, чтобы инициировать соединение и подписаться, здесь 10 клиентов подписываются на тему t/1.
./emqtt_bench sub -p 14567 --quic -t t/1 -c 10
Откройте новое окно, а также используйте QUIC для подключения и тестирования файла Publish.
./emqtt_bench pub -p 14567 --quic -t t/1 -c 1
Тест производительности будет проведен для «1 паб 10 саб»:
Проверьте использование локального UDP-порта 14567:
$ lsof -nP -iUDP | grep 14567
com.docke 29372 emqx 76u IPv6 0xea2092701c033ba9 0t0 UDP *:14567
beam.smp 50496 emqx 39u IPv6 0xea2092701c014eb9 0t0 UDP [::1]:52335->[::1]:14567
beam.smp 50496 emqx 40u IPv6 0xea2092701c017689 0t0 UDP [::1]:56709->[::1]:14567
beam.smp 50496 emqx 41u IPv6 0xea2092701c0151c9 0t0 UDP [::1]:52175->[::1]:14567
beam.smp 50496 emqx 42u IPv6 0xea2092701c0157e9 0t0 UDP [::1]:54050->[::1]:14567
beam.smp 50496 emqx 43u IPv6 0xea2092701c015af9 0t0 UDP [::1]:58548->[::1]:14567
beam.smp 50496 emqx 44u IPv6 0xea2092701c013639 0t0 UDP [::1]:52819->[::1]:14567
beam.smp 50496 emqx 45u IPv6 0xea2092701c016119 0t0 UDP [::1]:57351->[::1]:14567
beam.smp 50496 emqx 46u IPv6 0xea2092701c017999 0t0 UDP [::1]:52353->[::1]:14567
beam.smp 50496 emqx 47u IPv6 0xea2092701c017ca9 0t0 UDP [::1]:57640->[::1]:14567
beam.smp 50496 emqx 48u IPv6 0xea2092701c014ba9 0t0 UDP [::1]:55992->[::1]:14567
beam.smp 51015 emqx 39u IPv6 0xea2092701c017069 0t0 UDP [::1]:64686->[::1]:14567
Чтобы узнать больше о emqtt-bench, обратитесь к справке:
./emqtt_bench pub –help
./emqtt_bench conn –help
./emqtt_bench --help
Это первый взгляд на MQTT вместо QUIC. Как вы можете заметить, клиентские библиотеки и EMQX способны обеспечить тот же опыт, что и MQTT, на уровне API и уровне управления. Возможность воспользоваться всеми преимуществами функции QUIC, просто заменив транспортный уровень, очень удобна для разработчиков и способствовала популярности MQTT по сравнению с QUIC. Кроме того, NanoMQ поддерживает мостовое соединение MQTT через QUIC, что также обеспечивает еще одно гибкое решение.
Поскольку MQTT поверх QUIC широко используется в реальном мире, пользователи также могут использовать расширенные функции, такие как контроль перегрузки, плавный перенос соединений, сквозное шифрование и рукопожатие с малой задержкой. Оставайтесь с нами для получения более подробных объяснений методов и передовых методов, лежащих в основе этих функций.
Первоначально опубликовано на https://www.emqx.com.