Высокопроизводительный Backend-сервис на Go для автоматизации бронирования дорожек в боулинг-центре. Система спроектирована с расчетом на экстремальные нагрузки и гарантированную консистентность данных.
Система использует комбинированный подход для управления доступностью:
- On-Creation Generation: При создании расписания администратором, слоты на первые 14 дней генерируются синхронно. Это гарантирует моментальную готовность дорожки к бронированию.
- Background Maintenance: Фоновый воркер ежедневно обновляет "скользящее окно", поддерживая доступность слотов на 14 дней вперед.
- Цель: Максимальная производительность эндпоинтов чтения. Слоты — это плоская таблица, что исключает сложные вычисления в runtime.
Сервис спроектирован для работы в высоконагруженных окружениях. В ходе разработки были реализованы и протестированы две стратегии кэширования данных.
Эндпоинт GET /lanes/{id}/slots/list выполняет оптимизированный SELECT по индексам, что позволяет отдавать ответы в пределах нескольких миллисекунд.
Тестирование проводилось с помощью k6 на наполненной базе данных (100 дорожек, 500 пользователей, 75,000+ бронирований). (Сценарий: 85% чтение / 15% запись):
| Показатель | V1: In-memory Cache (Local) | V2: Redis Cache (Distributed) |
|---|---|---|
| Пропускная способность | ~10,500 RPS | ~1,600 RPS |
| Latency (p95) | 9.3 ms | 13.0 ms |
| Latency (avg) | 5.1 ms | 32.0 ms |
| Масштабируемость | Вертикальная | Горизонтальная (Stateless) |
Использована библиотека hashicorp/golang-lru/v2.
- Результат: Экстремально высокая производительность (10k+ RPS) за счет отсутствия сетевых задержек.
- Результат: Снижение RPS в ~6 раз по сравнению с локальной памятью из-за Round Trip Time (RTT) сетевых запросов.
Защита от двойного бронирования реализована на уровне PostgreSQL через частичный уникальный индекс:
CREATE UNIQUE INDEX unique_active_booking_per_slot
ON bookings(slot_id)
WHERE status = 'active';Это решение более эффективно, чем SELECT FOR UPDATE, так как оно предотвращает конфликты на уровне движка БД без блокировки всей таблицы.
Проект покрыт Unit и интеграционными тестами с упором на критические узлы бизнес-логики. Для изоляции зависимостей использованы моки.
Покрытие ключевых пакетов:
-
Handlers (API Layer):
82.1%— проверка валидации входящих данных, кодов ответов и обработки ошибок. -
Service (Business Logic):
74.1%— тестирование сценариев бронирования, правил доступности. -
Repository (Data Access):
82.1%— интеграционные тесты с реальной базой данных (через теги -tags=integration).
- Lanes: Управление дорожками разных типов (
standard,vip,pro,kids). - Schedules: Создание неизменяемых правил доступности.
- Bookings: Атомарное создание и отмена броней.
- Auth: JWT-авторизация с ролевой моделью (Admin/User).
GET /lanes/list- список всех дорожек.POST /lanes/create- создание новой дорожки (Admin).GET /lanes/{laneId}/slots/list?date=...- поиск свободных окон.
POST /bookings/create- забронировать слот.GET /bookings/my- мои активные брони.POST /bookings/{bookingId}/cancel- отмена бронирования.
make setupmake upГенерация 100 дорожек, 500 пользователей и 75к+ записей:
make seedmake load-testПроект реализован как production-ready система. Основной упор сделан на Performance Engineering: минимизацию задержек на "горячих" путях данных и обеспечение надежности транзакций при высоком параллелизме.