Тестовое задание
Реализуйте минимальный API бронирования слотов с горячим кешем и защитой от оверсела. Ниже — подробный бриф с требованиями и ожидаемыми результатами.
📘 Контекст
Вы проектируете сервис, который управляет бронью слотов (складские окна, доставка или время приема клиентов). Каждый слот имеет ограниченную вместимость, пользователи могут создавать временные холды, а затем подтверждать их. Нужно обеспечить корректную работу под нагрузкой: горячий кеш, транзакции, защита от оверсела.
⚙️ Функциональные требования
-
Получение доступных слотов
[ { "slot_id": 1, "capacity": 10, "remaining": 6 }, { "slot_id": 2, "capacity": 5, "remaining": 0 } ]- Кешировать результат на 5–15 секунд, предусмотреть защиту от cache stampede.
- После подтверждения или отмены данных инвалидировать кеш.
-
Создание холда
- Создает запись в таблице
holdsсо статусомheld. - Проверяет доступность мест и возвращает
409 Conflict, если capacity исчерпан. - Повторный запрос с тем же ключом возвращает прежний результат (идемпотентность).
- Холды живут 5 минут (фоновую очистку можно не реализовывать).
- Создает запись в таблице
-
Подтверждение холда
- Переводит холд в состояние
confirmed. - Атомарно уменьшает
remainingв слоте на 1 с защитой от оверсела. - При отсутствии мест возвращает
409 Conflict. - После успешного подтверждения инвалидирует кеш доступности.
- Переводит холд в состояние
-
Отмена холда
- Меняет состояние холда на
cancelled. - Возвращает слот в доступ, обновляя остаток.
- Инвалидирует кеш доступных слотов.
- Меняет состояние холда на
✅ Ожидаемые результаты
- Код на Laravel 12 (PHP 8.2+) и MySQL 8+.
- Маршруты определены в
routes/api.php. - Контроллеры:
AvailabilityController,HoldController. - Сервисный слой:
SlotService(транзакции, кеш, идемпотентность). - Минимальные миграции для таблиц слотов и холдов.
-
README с инструкциями запуска (
php artisan migrate,php artisan serve) и примерамиcurl-запросов (создание холда, повтор с тем же ключом, подтверждение, отмена, конфликт при оверселе).
➕ Дополнительные требования
- Запись экрана с голосовыми пояснениями во время реализации (подготовка и планирование заранее приветствуются).
- Готовое видео загрузить на Яндекс.Диск, открыть доступ для **@yandex.ru.
- В письме указать ссылку на видео, а также репозиторий с финальным кодом.
🚀 Что сделать кандидатy
- Изучите требования и спланируйте архитектуру сервиса.
- Реализуйте API с учетом кеша, транзакций и идемпотентности.
- Запишите видео процесса разработки с комментариями.
- Подготовьте README и примеры запросов.
- Выложите видео и репозиторий, отправьте ссылки на **@yandex.ru с темой письма «Видео-вакансия — результат - ФИО».
- Срок выполнения: 10 дней со дня получения письма с ссылкой на задание.
видео лайв кодинга
часть1
часть 2
Сергея Бакланова