Сценарий
IoT-устройства (в настоящее время устройство IPv4), которое отправляет через сокет TCP полезную нагрузку на сервер один раз в день. Сервер имеет публичный IP-адрес, устройство находится за маршрутизатором / NAT. Я собираюсь использовать модуль на основе ESP8266 (то есть Olimex один)
Цель сервер должен иметь возможность передавать данные любого клиента , когда это необходимо. Меня не интересует прямое общение клиента с клиентом (т. Е. Подключение к устройству с моего смартфона), как предполагается для дырокола.
Другие требования
Количество устройств IoT может возрасти до нескольких тысяч. Их интернет-соединение обеспечивается многими маршрутизаторами / модемами с поддержкой 4G. Каждый из них будет обслуживать 10-20 клиентов.
Предлагаемое решение
Насколько я понимаю, общим решением является MQTT. Клиенты периодически отправляют данные брокеру (то есть Mosquitto, работающему на хост-сервере), который, в свою очередь, обновляет основное веб-приложение, работающее на том же сервере.
Вопрос
Подходит ли подход MQTT для «большого» количества устройств (более 1000), большинство из которых находятся за маршрутизатором 4G?
Ответы:
1000 клиентов легко могут быть обработаны любым достойным брокером MQTT; есть тест от Scalagent, который показывает, что ПК с:
может справиться с 60 000 издателей под управлением Mosquitto. Это намного превышает ваши требуемые 1000 издателей, поэтому даже на относительно слабом сервере вы все равно сможете обрабатывать необходимое количество.
Некоторые другие брокеры заявляют о еще более высокой производительности (конечно, с соответственно большей мощностью сервера), например, HiveMQ , который, как утверждается, обслуживает 10 миллионов издателей.
Брокеры MQTT, как правило, ожидают постоянное соединение и время ожидания клиентов, которые не отправляют ответы на пинг (или другие действия) периодически. Вы можете отключиться от сети после публикации, но, очевидно, вы не сможете ничего получить, если отключитесь.
MQTT поддерживает концепцию «сохраненных» сообщений, что может быть полезно. Веб-клиент может опубликовать что-либо в теме с сохраненным флагом, и это сообщение затем будет сохранено посредником. Каждый раз, когда ваши клиенты повторно подключаются и подписываются на тему, они получат сохраненное сообщение (даже если оно было опубликовано несколько часов назад). Сохраненное сообщение публикуется каждый раз, когда клиент подписывается на эту тему, что может помочь вам, если у вас нестабильное соединение и вам нужно сохранить сообщение до тех пор, пока клиент не переподключится.
источник
Вы можете использовать постоянные сеансы от клиентов, например, установить флаг очистки на false при подключении. В этом случае событие, когда ваш клиент находится в автономном режиме, брокер помещает для него сообщение в буфер и отправляет его после подключения устройства.
По поводу количества - 10K - это относительно небольшое количество даже для одного сервера. Вы можете настроить сервер Linux на хранение 500 тыс. Активных соединений, и если ваш брокер будет работать в облаке, например, предоставленным в качестве услуги каким-либо провайдером, то вы можете хранить даже миллионы активных соединений с ним.
Кстати, я думаю, что Mosquitto или любая другая локальная установка - идеальный выбор для разработки и тестирования, но когда вы начнете работу, вам понадобится SaaS MQTT-брокер со всеми функциями, такими как HA, резервирование, отработка отказа и т. Д.
источник