Skip to content

er-davo/strike-reserve

Repository files navigation

StrikeReserve: High-Performance Bowling Booking Engine

Высокопроизводительный Backend-сервис на Go для автоматизации бронирования дорожек в боулинг-центре. Система спроектирована с расчетом на экстремальные нагрузки и гарантированную консистентность данных.


Ключевые инженерные решения

1. Гибридная генерация слотов

Система использует комбинированный подход для управления доступностью:

  • On-Creation Generation: При создании расписания администратором, слоты на первые 14 дней генерируются синхронно. Это гарантирует моментальную готовность дорожки к бронированию.
  • Background Maintenance: Фоновый воркер ежедневно обновляет "скользящее окно", поддерживая доступность слотов на 14 дней вперед.
  • Цель: Максимальная производительность эндпоинтов чтения. Слоты — это плоская таблица, что исключает сложные вычисления в runtime.

2. Производительность и Кэширование

Сервис спроектирован для работы в высоконагруженных окружениях. В ходе разработки были реализованы и протестированы две стратегии кэширования данных.

Эндпоинт GET /lanes/{id}/slots/list выполняет оптимизированный SELECT по индексам, что позволяет отдавать ответы в пределах нескольких миллисекунд.

Сравнительные результаты нагрузочного тестирования (k6)

Тестирование проводилось с помощью 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)

Анализ стратегий

1. Локальный кэш (In-memory)

Использована библиотека hashicorp/golang-lru/v2.

  • Результат: Экстремально высокая производительность (10k+ RPS) за счет отсутствия сетевых задержек.

2. Распределенный кэш (Redis)

  • Результат: Снижение RPS в ~6 раз по сравнению с локальной памятью из-за Round Trip Time (RTT) сетевых запросов.

3. Гарантия консистентности

Защита от двойного бронирования реализована на уровне 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).

API Эндпоинты

Lanes & Slots

  • GET /lanes/list - список всех дорожек.
  • POST /lanes/create - создание новой дорожки (Admin).
  • GET /lanes/{laneId}/slots/list?date=... - поиск свободных окон.

Bookings

  • POST /bookings/create - забронировать слот.
  • GET /bookings/my - мои активные брони.
  • POST /bookings/{bookingId}/cancel - отмена бронирования.

Быстрый запуск

1. Настройка

make setup

2. Поднятие сервисов

make up

3. Наполнение БД (Seed)

Генерация 100 дорожек, 500 пользователей и 75к+ записей:

make seed

4. Запуск тестов нагрузки

make load-test

Архитектурная цель

Проект реализован как production-ready система. Основной упор сделан на Performance Engineering: минимизацию задержек на "горячих" путях данных и обеспечение надежности транзакций при высоком параллелизме.

About

Высокопроизводительный Backend-сервис на для автоматизации бронирования дорожек в боулинг-центре.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors