IoT Parking Service - это сервис, который собирает данные о свободных местах на парковках с помощью IoT-устройств и предоставляет эту информацию автономным автомобилям для бронирования мест и построения маршрутов.
- Обработка данных от IoT-устройств (эмулируемых через Data Simulator) и обновление информации о парковках в базе данных.
- Передача данных о свободных местах на парковках автономным автомобилям в реальном времени.
- Валидация поступающих данных через IoT Controller.
- Проверка данных на соответствие мгновенным и длительным правилам через Rule Engine.
- Хранение событий и состояний парковок для последующего анализа.
- Предоставление возможности автомобилям запросить ближайшую свободную парковку.
- InfluxDB — для хранения временных рядов (состояние парковок с метками времени).
- PostgreSQL — для хранения метаданных (информация о парковках).
- Шардирование — реализована физическая репликация PostgreSQL с несколькими репликами для распределения нагрузки.
- Реплики — настроены слоты репликации для надежного распространения данных между master и replica узлами.
- PgBouncer — реализовано управление пулом соединений для оптимизации использования ресурсов БД.
- Nginx — для распределения запросов между микросервисами.
- Используется метод Least Connections
- Настройка проверок здоровья сервисов для отказоустойчивости
- Mosquitto — для передачи данных от IoT-устройств к другим компонентам системы.
- Redis — для быстрого доступа к часто используемым данным:
- Кэширование текущего состояния парковок (device_id, free_spots, timestamp)
- Снижение нагрузки на базы данных для часто запрашиваемой информации
- Настроенное время жизни (TTL) для разных типов данных
- Поддержка частичного обновления кэша для оптимизации производительности
- Реализована стратегия "write-through" для обеспечения консистентности данных
- Promtail и Loki — для сбора и анализа логов системы.
- Grafana и Prometheus — для визуализации метрик и мониторинга производительности.
Настроены базовые алерты для мониторинга инфраструктуры:
- HighCpuUsage — использование процессора превышает 80% в течение 5 минут
- HighMemoryUsage — объем оперативной памяти превышает 75% в течение 5 минут
- ServiceDown — сервисы недоступны более 30 секунд
Алерты обрабатываются через AlertManager и доступны по адресу:
- Prometheus алерты: http://localhost:9090/alerts
- AlertManager: http://localhost:9093
В проекте учитываются два типа "пользователей": IoT-устройства, передающие данные, и автономные автомобили, запрашивающие информацию.
-
Максимальное количество IoT-устройств: На старте сервис рассчитан на 150 устройств, каждое из которых отправляет данные каждые 4 секунды. В перспективе возможно масштабирование до 1000 устройств для обслуживания крупных городов или сети парковок.
-
Максимальное количество автомобилей: Предполагается поддержка 500-1000 автономных автомобилей в часы пик, каждый с возможностью до 2 активных сессий (например, запрос состояния и бронирование). Итого максимум 1000-2000 сессий.
-
Время отклика на запросы автомобилей: Целевое время — 200 мс для большей части запросов, допустимый диапазон — 200-500 мс, чтобы обеспечить быструю реакцию для навигации.
-
Время обработки внутренних операций: Простые операции (например, валидация данных в IoT Controller, запись в InfluxDB) — 50 мс. Сложные операции (проверка правил в Rule Engine) — 50-100 мс.
-
Прогнозируемый объём данных на старте: С 150 устройствами, отправляющими данные каждые 4 секунды (сообщение ~65 байт), объём составляет: 150 × (86400 ÷ 4) × 65 = ~200.8 МБ/день. С учётом логов (Loki) и метрик (Prometheus) — ~250 МБ/день. Данные в PostgreSQL (данные парковок, бронирования) добавляют незначительный объём (~1-5 МБ на старте).
-
Возможный рост объёма данных: При масштабировании до 1000 устройств: 1000 × (86400 ÷ 4) × 65 = ~1.34 ГБ/день. С учётом логов и метрик — до 1.5-2 ГБ/день. Рост числа автомобилей добавит данные о бронированиях (~10-20 МБ ежегодно).


- Docker и Docker Compose
- .NET 9.0 SDK (для разработки)
docker-compose -f docker-compose.yml -f docker-compose.scale.yml -f docker-compose.monitoring.yml up -d
docker-compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d
API_REPLICAS=3 PG_MAX_CONNECTIONS=200 docker-compose -f docker-compose.yml -f docker-compose.scale.yml up -d
docker-compose -f docker-compose.tests.yml up -d
После запуска системы будут доступны следующие интерфейсы:
- ParkingApi: http://localhost:8080
- Grafana: http://localhost:3000 (admin/admin)
- Prometheus: http://localhost:9090
- InfluxDB: http://localhost:8086
- PostgreSQL: localhost:5432
- Redis: localhost:6379
- Mosquitto MQTT: localhost:1883
Проект содержит следующие тесты:
- ParkingApi/tests/ - Unit-тесты для API контроллеров и сервисов, интеграционные тесты для проверки взаимодействие между компонентами системы.
- data_simulator/tests/ - Тесты симулятора данных IoT
- rule_engine/tests/ - Тесты движка правил
- vehicle_simulator/tests/ - Тесты симулятора автомобилей
# Тесты ParkingApi
cd ParkingApi
dotnet test
# Тесты всего решения
dotnet test highload-2025.sln
# Запуск тестового окружения
docker-compose -f docker-compose.tests.yml up -d
# Запуск интеграционных тестов
docker-compose -f docker-compose.tests.yml exec test-runner dotnet test
# Вертикальное масштабирование
./tsung/scripts/vertical-scaling-test.sh
# Горизонтальное масштабирование
./tsung/scripts/horizontal-scaling-test.sh
# Анализ результатов масштабирования
./tsung/scripts/analyze-scaling-results.sh
- ControllerTests - Тестирование API контроллеров
- ServiceTests - Тестирование бизнес-логики сервисов
- DatabaseTests - Тестирование работы с PostgreSQL и InfluxDB
- ValidationTests - Тестирование валидации входных данных
- IoT Data Flow Tests - Проверка потока данных от IoT устройств через MQTT до баз данных
- Vehicle API Tests - Тестирование API для автомобилей
- Rule Engine Tests - Проверка работы движка правил
- Load Tests - Нагрузочные тесты системы
- Проверка соответствия требованиям по времени отклика (200-500 мс)
- Тестирование пропускной способности для 1000+ устройств
- Проверка масштабируемости до 2000 сессий
- Тесты эффективности кэширования и шардирования данных
После запуска с мониторингом доступны дашборды:
- System Overview - Общая производительность системы
- API Performance - Метрики API (время отклика, throughput)
- Database Metrics - Производительность PostgreSQL и InfluxDB
- IoT Data Flow - Метрики потока данных от IoT устройств
- Cache Performance - Эффективность кэширования и hit/miss rate
- DB Sharding - Метрики распределения нагрузки между репликами
Логи всех сервисов собираются через Promtail и доступны в Grafana через Loki datasource.
- ParkingApi/ - Основное API на .NET 9
- iot_controller/ - Контроллер IoT устройств
- rule_engine/ - Движок обработки правил
- data_simulator/ - Симулятор IoT устройств
- vehicle_simulator/ - Симулятор автомобилей
- monitoring/ - Конфигурации мониторинга
- postgresql/ - Скрипты базы данных
- mosquitto/ - MQTT брокер конфигурация
Основные переменные окружения настраиваются в docker-compose.yml
:
POSTGRES_CONNECTION
- строка подключения к PostgreSQLINFLUXDB_URL
- URL InfluxDBMQTT_BROKER_URL
- URL MQTT брокераREDIS_CONNECTION
- строка подключения к RedisAPI_REPLICAS
- количество экземпляров API для горизонтального масштабированияPG_MAX_CONNECTIONS
- максимальное количество соединений PostgreSQLPOSTGRES_REPLICATION_USER
- пользователь для репликации PostgreSQLCACHE_TTL_SECONDS
- время жизни объектов в кэше Redis
nginx.conf
- Конфигурация балансировщика нагрузкиloki-config.yaml
- Настройки Loki для сбора логовpromtail-config.yaml
- Конфигурация Promtailpostgres/replica.conf
- Конфигурация PostgreSQL для репликpostgres/pg_hba.conf
- Настройки доступа к PostgreSQL