Это бэкенд-сервис для автоматического назначения ревьюеров для Pull Requests (PR) внутри команд. Сервис написан на Go и использует PostgreSQL в качестве базы данных. Он предоставляет HTTP API для управления командами, пользователями и PR.
- Структура проекта
- Инструкция по запуску
- Миграция базы данных
- Конфигурация
- Запуск сервиса
- API Эндпоинты
- Детали реализации и принятые решения
- Результаты нагрузочного тестирования
- Интеграционное тестирование
- Конфигурация линтера
Проект организован следующим образом:
cmd/— точка входа (main.go).api/— спецификация API (OpenAPI).internal/— внутренняя логика приложения:domain/— структуры данных (User, Team, PR).handler/— обработка HTTP запросов.service/— бизнес-логика.repository/— работа с базой данных.config/— настройки приложения.
migrations/— SQL файлы для создания таблиц.load-test/— нагрузочные тесты (k6).interation-tests/— интеграционные тесты (Python).
Для удобства управления проектом используется Makefile.
-
Запуск проекта в Docker (рекомендуемый способ):
make docker-run
Эта команда соберет и запустит все необходимые контейнеры (приложение, база данных, мигратор). Сервис будет доступен по адресу
http://localhost:8080. -
Остановка проекта:
make docker-stop
-
Локальная сборка (без Docker):
make build
-
Локальный запуск (без Docker):
make run
Примечание: для локального запуска требуется запущенная база данных PostgreSQL.
-
Запуск тестов:
make test -
Запуск линтера:
make lint
-
Очистка:
make clean
Для создания таблиц в базе данных используются миграции. Я выбрал этот подход, чтобы хранить историю изменений структуры БД в коде и иметь возможность легко и предсказуемо обновлять базу при добавлении новых функций, вместо того чтобы каждый раз пересоздавать её вручную.
При запуске через docker-compose миграции применяются автоматически.
Настройки конфигурации управляются в internal/config/config.go. Вы можете загружать конфигурации из переменных окружения или конфигурационных файлов.
Для запуска сервиса используйте Docker Compose:
- Сборка и запуск сервиса:
docker-compose up
Сервис будет доступен по адресу http://localhost:8080.
Эндпоинты API определены в файле api/openapi.yaml.
В процессе разработки было принято несколько архитектурных решений и улучшений:
- Поддержка нескольких команд: Хотя первоначальные требования можно было интерпретировать как строгую модель "один пользователь - одна команда", система была спроектирована с учетом будущего расширения. Внутренняя логика поддерживает концепцию принадлежности пользователей к нескольким командам, что позволит в будущем создавать более сложные организационные структуры.
- Улучшения тестируемости: Для обеспечения надежного интеграционного тестирования был добавлен API эндпоинт
clear. Это позволяет полностью сбросить базу данных, гарантируя чистое состояние для каждого запуска набора тестов. - Расширяемость Admin API: Структура API спроектирована так, чтобы легко вместить будущие расширения Admin API для лучшего управления системой.
- Проверка производительности: Были проведены комплексные нагрузочные и интеграционные тесты для проверки того, что сервис соответствует требуемым техническим спецификациям и надежно работает под нагрузкой.
Нагрузочное тестирование проводилось с использованием инструмента k6. Сценарий эмулировал работу пользователей, выполняющих полный жизненный цикл Pull Request (создание, переназначение, слияние) и запросы на получение информации.
Параметры теста:
- Целевая нагрузка: 10 запросов в секунду (в 2 раза выше требований ТЗ).
- Длительность: 5 минут.
- Виртуальные пользователи: 20-200.
Результаты:
| Метрика | Значение | Требование ТЗ | Статус |
|---|---|---|---|
| RPS (HTTP) | 17.51 | - | - |
| RPS (Сценарии) | 9.56 | 5 | ✅ OK (x2) |
| Latency P95 | 12.61 ms | < 300 ms | ✅ OK |
| Success Rate (SLI) | 100.00% | > 99.9% | ✅ OK |
| Error Rate (5xx) | 0.00% | < 0.1% | ✅ OK |
Подробную информацию о методике тестирования и инструкцию по запуску можно найти в README нагрузочных тестов.
В проекте реализованы интеграционные тесты, покрывающие основные сценарии использования API. Подробную информацию о них и инструкцию по запуску можно найти в README интеграционных тестов.
В корень проекта был добавлен файл .golangci.yml для обеспечения согласованности кода. Он настроен с набором стандартных линтеров.