Минимальный API для управления бронированием слотов (складские окна, доставка, прием клиентов) с защитой от оверсела и использованием «горячего» кеша.
- Бронирование слотов: создание временных холдов и их подтверждение.
- Защита от оверсела: строгий контроль остатка мест (
remaining) через транзакции и пессимистические блокировки. - Горячий кеш: список доступных слотов кешируется с защитой от "cache stampede" (одновременного пересчета).
- Идемпотентность: поддержка заголовка
Idempotency-Key(UUID) для предотвращения дубликатов при повторных запросах. - Слои архитектуры: четкое разделение на контроллеры, сервисы (SlotService), модели и кастомные исключения.
- Backend: Laravel 12, PHP 8.2+
- База данных: MySQL 8.0+
- Очереди и Кеш: по умолчанию используется драйвер
database(для простоты запуска), легко переключается на Redis/RabbitMQ через.env.
- Слот (Slot) — окно времени или ресурс с ограниченной вместимостью (
capacity). - Холд (Hold) — временная бронь места. Имеет TTL (время жизни) 5 минут.
- Оверсел (Oversell) — ситуация, когда забронировано больше мест, чем доступно. Система блокирует такие действия (HTTP 409).
- Идемпотентность — гарантия того, что повторный запрос с тем же ключом не создаст дубликат записи.
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/slots/availability |
Список доступных слотов (кеш 5-15 сек) |
POST |
/api/slots/{id}/hold |
Создание временного холда (TTL 5 мин) |
POST |
/api/holds/{id}/confirm |
Подтверждение холда (уменьшает remaining) |
DELETE |
/api/holds/{id} |
Отмена холда (возвращает место, если подтвержден) |
Проект настроен для запуска в Docker контейнерах.
-
Клонируйте репозиторий:
git clone https://github.com/sergey0002/slotlogistic.git cd slotlogistic -
Запустите сборку и контейнеры:
docker-compose up -d --build
-
Установите зависимости и выполните миграции:
docker-compose exec php composer install docker-compose exec php php artisan migrate --seed
Запуск тестов внутри контейнера:
docker-compose exec php php artisan test