6 KiB
statCollector
Техническое задание "StatCollector" — высоконагруженный сервер сбора и агрегации метрик
- Наименование системы
"StatCollector" — высокопроизводительный TCP-сервер для приёма, агрегации и хранения статистических метрик в реальном времени на языке C++.
- Предметная область
В современных распределённых системах (микросервисы, IoT-устройства, веб-приложения) критически важно собирать и агрегировать метрики в реальном времени:
- количество запросов к API;
- время ответа (latency);
- ошибки (HTTP 5xx, таймауты);
- загрузка CPU/памяти;
- бизнес-метрики (количество продаж, активных пользователей).
Задача — разработать упрощённый аналог систем мониторинга (StatsD, Prometheus), который принимает метрики от множества источников, агрегирует их по заданным интервалам и предоставляет доступ к агрегированным данным.
- Постановка задачи
Разработать сервер на C++, который:
- принимает TCP-подключения от произвольного числа клиентов (агентов мониторинга);
- принимает метрики в текстовом формате;
- агрегирует метрики за заданные временные интервалы (например, за 5 секунд, 1 минуту);
- поддерживает разные типы метрик (счётчики, текущие значения, таймеры);
- предоставляет доступ к агрегированным данным через отдельный интерфейс (TCP или простая HTTP-обвязка);
- выдерживает высокую нагрузку по приёму метрик (десятки тысяч событий в секунду).
- Функциональные требования
| ID | Требование |
|---|---|
| FR1 | Клиент подключается по TCP и отправляет метрику в формате: `metric_name:value |
| FR2 | Поддержка типов метрик: • counter — счётчик (суммируется за интервал)• gauge — текущее значение (записывается последнее)• timer — время в мс (вычисляется среднее, p95) |
| FR3 | Автоматическая агрегация метрик по временным окнам (например, каждые 5 секунд) |
| FR4 | Возможность запросить агрегированные метрики по команде STATS metric_name |
| FR5 | Поддержка множества одновременных клиентских подключений |
| FR6 | Поддержка тегов для метрик: `api_requests:1 |
| FR7 | (Опционально) Экспорт метрик в формате Prometheus через HTTP-эндпоинт /metrics |
- Нефункциональные требования
| ID | Требование |
|---|---|
| NFR1 | Сервер должен выдерживать приём не менее 50 000 метрик в секунду |
| NFR2 | Среднее время обработки одной метрики — не более 50 мкс |
| NFR3 | Отсутствие гонок данных при конкурентном приёме метрик |
| NFR4 | Устойчивость к некорректным форматам метрик (сервер не падает) |
| NFR5 | Автоматическая очистка старых агрегированных данных |
- Технологический стек
| Компонент | Технология | Обоснование |
|---|---|---|
| Язык | C++17/20 | Максимальная производительность |
| Сеть | Boost.Asio | Асинхронный ввод-вывод для тысяч подключений |
| Хранилище | std::unordered_map + шардирование |
Высокая производительность при конкурентном доступе |
| Агрегация | Инкрементальные алгоритмы (P² для квантилей) | Минимальные накладные расходы |
| Многопоточность | Пул потоков + lock-free очереди | Максимальная пропускная способность |
| Тестирование | Самописный генератор нагрузки на C++ | Полный контроль над тестированием |
-
Результаты (Deliverables)
-
Исходный код сервера на C++ с CMake
-
Тестовый клиент для ручной проверки (или инструкция по подключению через netcat/telnet)
-
Нагрузочный генератор для автоматического тестирования
-
Отчёт с:
- Архитектурой и принятыми решениями
- Результатами нагрузочного тестирования (таблицы, графики)
- Анализом узких мест
- Рекомендациями по улучшению