Обновить README.md

This commit is contained in:
Ural 2026-09-10 10:15:35 +05:00
parent 96580c66f0
commit a62041d4a1

View file

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