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

6 KiB
Raw Blame History

statCollector

Техническое задание "StatCollector" — высоконагруженный сервер сбора и агрегации метрик

  1. Наименование системы

"StatCollector" — высокопроизводительный TCP-сервер для приёма, агрегации и хранения статистических метрик в реальном времени на языке C++.

  1. Предметная область

В современных распределённых системах (микросервисы, IoT-устройства, веб-приложения) критически важно собирать и агрегировать метрики в реальном времени:

  • количество запросов к API;
  • время ответа (latency);
  • ошибки (HTTP 5xx, таймауты);
  • загрузка CPU/памяти;
  • бизнес-метрики (количество продаж, активных пользователей).

Задача — разработать упрощённый аналог систем мониторинга (StatsD, Prometheus), который принимает метрики от множества источников, агрегирует их по заданным интервалам и предоставляет доступ к агрегированным данным.

  1. Постановка задачи

Разработать сервер на C++, который:

  • принимает TCP-подключения от произвольного числа клиентов (агентов мониторинга);
  • принимает метрики в текстовом формате;
  • агрегирует метрики за заданные временные интервалы (например, за 5 секунд, 1 минуту);
  • поддерживает разные типы метрик (счётчики, текущие значения, таймеры);
  • предоставляет доступ к агрегированным данным через отдельный интерфейс (TCP или простая HTTP-обвязка);
  • выдерживает высокую нагрузку по приёму метрик (десятки тысяч событий в секунду).
  1. Функциональные требования
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
  1. Нефункциональные требования
ID Требование
NFR1 Сервер должен выдерживать приём не менее 50 000 метрик в секунду
NFR2 Среднее время обработки одной метрики — не более 50 мкс
NFR3 Отсутствие гонок данных при конкурентном приёме метрик
NFR4 Устойчивость к некорректным форматам метрик (сервер не падает)
NFR5 Автоматическая очистка старых агрегированных данных
  1. Технологический стек
Компонент Технология Обоснование
Язык C++17/20 Максимальная производительность
Сеть Boost.Asio Асинхронный ввод-вывод для тысяч подключений
Хранилище std::unordered_map + шардирование Высокая производительность при конкурентном доступе
Агрегация Инкрементальные алгоритмы (P² для квантилей) Минимальные накладные расходы
Многопоточность Пул потоков + lock-free очереди Максимальная пропускная способность
Тестирование Самописный генератор нагрузки на C++ Полный контроль над тестированием
  1. Результаты (Deliverables)

  2. Исходный код сервера на C++ с CMake

  3. Тестовый клиент для ручной проверки (или инструкция по подключению через netcat/telnet)

  4. Нагрузочный генератор для автоматического тестирования

  5. Отчёт с:

    • Архитектурой и принятыми решениями
    • Результатами нагрузочного тестирования (таблицы, графики)
    • Анализом узких мест
    • Рекомендациями по улучшению