Сервис бронирования переговорок. Позволяет администраторам управлять ресурсами и расписанием, а пользователям — находить свободные слоты и бронировать их.
- Language: Go 1.26+
- Database: PostgreSQL
- Router: chi
- Logging: zap
- Validation: go-playground/validator
- Documentation: Swagger (swaggo)
- Testing: testify, mock, k6 (load testing)
Команда поднимет приложение, базу данных и выполнит миграции(http://localhost:8080):
make upДля проверки работы под нагрузкой и базового тестирования:
make seedЗапуск тестов:
make testЗапуск тестов и покрытие:
make cover*Текущее покрытие проекта:
- ~55% (всего проека)(
go test -coverprofile=coverage.out ./... && go tool cover -func=coverage.out) - ~71.3%(internal и test)(
go test -coverpkg=./internal/... -coverprofile=coverage.out ./internal/... ./tests/... && go tool cover -func=coverage.out
В проекте реализован Lazy Generation (Ленивая генерация) подход:
- Слоты не создаются заранее на годы вперед.
- При первом запросе списка слотов на конкретную дату (
/rooms/{id}/slots/list), система проверяет их наличие в БД. - Если слотов нет, они генерируются на лету на основе расписания и сохраняются в БД.
- Обоснование: Это предотвращает избыточное раздувание базы данных (до 1k слотов в день на комнату) и гарантирует стабильность UUID для бронирования. Для предотвращения "race condition" при одновременном запросе одной даты разными пользователями используется
golang.org/x/sync/singleflight.
В проекте в качестве идентификаторов ресурсов (ID) используются UUIDv7. Это осознанный выбор в пользу производительности базы данных по следующим причинам:
- Встроенный Timestamp: В отличие от UUIDv4 (который полностью случаен), UUIDv7 содержит в себе временную метку (Unix timestamp с точностью до миллисекунд). Это позволяет сортировать идентификаторы по времени их создания без использования дополнительных колонок created_at.
- Оптимизация B-tree индексов: PostgreSQL использует B-tree для индексации первичных ключей. Так как UUIDv7 монотонно возрастают (являются k-sortable), новые записи вставляются в "конец" индекса.
Swagger UI доступен после запуска приложения по адресу:
http://localhost:8080/swagger/index.html
Требования: 100 RPS, SLI 99.9%, Latency < 200ms для списка слотов.
Для запуска:
make loadtest- Регистрация и авторизация: Полноценные
/registerи/loginс хешированием паролей (bcrypt). - Makefile: Удобные команды для управления проектом.
- Swagger: Полная аннотация кода и генерация доки.
- Linter: Настроен
.golangci.yaml. - Нагрузочное тестирование: Скрипты k6 включены в проект.
