контур: cdn.selion.ru

Телеметрия промышленного оборудования

Команда доходит до устройства за NAT за секунды

Агент Selion не ждёт входящих подключений: он сам держит открытый запрос к очереди команд и получает ответ в момент, когда команда появилась. Белый IP, VPN и проброс портов на объекте не нужны.

30 с
максимальное удержание одного запроса
0 %
кэшируемых ответов в транспортном контуре
~240 Б
типичный размер ответа очереди команд

Как устроен обмен

Один агент — одно удерживаемое соединение

Ниже — реальная картина запросов четырёх агентов за полторы минуты. Полоса означает открытый запрос: агент уже отправил его, но ответ ещё не пришёл, потому что команды для устройства пока нет.

agent-8f3c1a agent-2b91d4 agent-c05e77 agent-41ba09 GET · 204 · 30.0 s GET · 204 · 30.0 s GET · 200 · 15.4 s GET · 204 · 22.6 s 200 · 8.1 s GET · 204 · 30.0 s GET · 204 · 30.0 s GET · 204 · 30.0 s GET · 204 · 30.0 s 200 · 11.2 s GET · 204 · 30.0 s GET · 204 · 30.0 s 0 c 30 c 60 c 90 c
204 — истекло удержание, агент переоткрывает запрос 200 — пришла команда, ответ уникален для устройства
  1. Агент открывает запрос Устройство обращается к cdn.selion.ru и просит очередь команд подождать до 30 секунд, если команд нет.
  2. Ядро держит соединение Ответ не формируется, пока оператор не нажмёт кнопку в панели или не сработает расписание обслуживания.
  3. Ответ уходит одному устройству В теле — команда и номер последовательности seq, действительный только для этого агента и только один раз.
  4. Агент подтверждает и открывает новый запрос Подтверждение уходит отдельным запросом, после чего цикл начинается заново — разрыва между циклами нет.
# обращение агента GET /v1/agents/8f3c1a/commands?wait=30 Host: cdn.selion.ru Authorization: Bearer <agent-token> X-Agent-Seq: 1042 # ответ ядра HTTP/2 200 Content-Type: application/json Cache-Control: no-store, must-revalidate Pragma: no-cache Vary: Authorization X-Agent-Seq: 1043 Content-Length: 212

Кэширование

Почему ответов много и почему они не кэшируются

Транспортный контур устроен так, что каждый ответ существует ровно в одном экземпляре и предназначен ровно одному устройству. Это не упущение в настройке заголовков, а условие корректной работы: кэш здесь означал бы чужую команду на чужом объекте.

Ответ адресован одному агенту

В теле лежит команда для конкретного серийного номера. Отдача такого ответа второму устройству из кэша означала бы выполнение чужой команды на чужом объекте, поэтому ядро ставит no-store на каждый ответ очереди.

Содержимое известно только в момент отправки

Запрос висит открытым до 30 секунд и завершается либо командой, либо пустым 204. Один и тот же URL за минуту даёт разные ответы — кэшировать нечего, повторно использовать нечего.

Запросов много по числу устройств, а не по числу людей

Каждый агент держит одно соединение и переоткрывает его сразу после ответа. Тысяча устройств на объекте — это примерно 33 запроса в секунду круглосуточно, при среднем ответе в 240 байт.

Что как раз кэшируется

Статика панели, схемы объектов и файлы прошивок из /firmware/ отдаются с immutable и живут в кэше месяцами. Поэтому доля попаданий по домену в целом низкая: основной объём запросов приходится на очередь команд.

Характеристики транспорта

Применение

Где это работает

Энергоснабжение

ИБП и генераторные установки

Состояние батарей и нагрузки снимается непрерывно, тестовый пуск запускается из панели без выезда на объект.

Холодоснабжение

Камеры и торговые витрины

Температурные журналы по каждой точке, оповещение при отклонении и удалённая корректировка уставок.

Инженерные сети

Насосные и узлы учёта

Показания приборов, диагностика связи и перезапуск контроллера командой из очереди, если узел перестал отвечать.