statCollector/README.md
2026-09-10 10:15:35 +05:00

83 lines
6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. **Отчёт** с:
- Архитектурой и принятыми решениями
- Результатами нагрузочного тестирования (таблицы, графики)
- Анализом узких мест
- Рекомендациями по улучшению
---