- IoT-устройство (Микроконтроллер):
- Отвечает за сбор данных с датчиков и их отправку на сервер (
POST /sensors). - Периодически опрашивает сервер на наличие команд (
GET /commands).
- Отвечает за сбор данных с датчиков и их отправку на сервер (
- Веб-приложение (Пользовательский интерфейс):
Служит для взаимодействия пользователя с системой:
- отправки команд на устройства (
POST /commands) - просмотра данных с датчиков (
GET /sensors).
- отправки команд на устройства (
- Nginx (Прокси-сервер):
- Принимает все входящие HTTP-запросы и направляет их на соответствующий API-сервер.
- Может использоваться для SSL-терминирования и балансировки нагрузки.
- API-сервер (FastAPI-приложение):
Центральный компонент, который обрабатывает все запросы:
- Для входящих данных с датчиков: получает запросы, добавляет задачи в очередь
sensors data. - Для исходящих команд: получает запросы от веб-приложения, добавляет задачи в очередь
commands dataи, что очень важно, забирает команды из этой очереди по запросу от IoT-устройства. - Для логгирования команд: после отправки команды в очередь, добавляет информацию о событии в очередь
commands log.
- Для входящих данных с датчиков: получает запросы, добавляет задачи в очередь
- RabbitMQ (Брокер сообщений):
Надёжное хранилище для всех асинхронных задач. Выделено три отдельные очереди:
sensors data: Для данных, поступающих с устройств.commands data: Для команд, ожидающих исполнения устройством.commands log: Для записи истории команд в базу данных.
- Воркеры (Рабочие процессы Celery):
Автономные процессы, которые слушают очереди и выполняют "тяжёлую" работу.
- Воркер для данных с датчиков: Забирает задачи из очереди
sensors data, записывает данные в Postgres и обновляет Redis-кэш. - Воркер для логгирования: Забирает задачи из очереди
commands logи записывает историю команд в Postgres.
- Воркер для данных с датчиков: Забирает задачи из очереди
- Хранилище данных:
- Redis-кэш: Хранит самые свежие данные с датчиков для быстрого доступа.
- Postgres: Долгосрочное хранилище для всех исторических данных с датчиков и истории команд.
- Сбор данных с сенсоров
- IoT-устройство считывает данные и отправляет их на Nginx (
POST /sensors). - Nginx перенаправляет запрос на API-сервер.
- API-сервер добавляет задачу в очередь
sensors dataв RabbitMQ и сразу возвращает подтверждение устройству (201 Created). - Воркер для данных забирает задачу из очереди, сохраняет данные в Postgres и обновляет Redis-кэш.
- Пользователь с помощью веб-приложения запрашивает данные со своих устройств (
GET /sensors). - API-сервер проверяет наличие данных датчиков в Redis-кэше, возвращает их если они етсь
- IoT-устройство считывает данные и отправляет их на Nginx (
- Отправка команды устройству
- Пользователь с помощью веб-приложения направляет запрос с командой на Nginx (
POST /commands). - Nginx перенаправляет запрос на API-сервер.
- API-сервер добавляет задачу в очередь
commands dataи сразу возвращает подтверждение веб-приложению (201 Created). Также API-сервер сразу же добавляет сообщение о созданной задаче в очередьcommands log. - Воркер для истории команд забирает сообщение из очереди
commands logи сохраняет данные в базу Postgres. - IoT-устройство опрашивает API-сервер на наличие новых команд (
GET /commands). - API-сервер синхронно забирает задачу из очереди
commands dataи возвращает её в ответе (200 OK) - IoT-устройство выполняет команду.
- Пользователь с помощью веб-приложения направляет запрос с командой на Nginx (
