From a62041d4a1b0716585ad4efabbd9697ebe496918 Mon Sep 17 00:00:00 2001 From: Ural Date: Thu, 10 Sep 2026 10:15:35 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/README.md b/README.md index 978dfe9..f0c156e 100644 --- a/README.md +++ b/README.md @@ -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** | Поддержка типов метрик:
• `counter` — счётчик (суммируется за интервал)
• `gauge` — текущее значение (записывается последнее)
• `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. **Отчёт** с: + - Архитектурой и принятыми решениями + - Результатами нагрузочного тестирования (таблицы, графики) + - Анализом узких мест + - Рекомендациями по улучшению + +--- +