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