Slotfactory - это программный компонент или сервис для управления слотами: ограниченными временными, ресурсными либо логическими позициями, доступными для бронирования, распределения или обработки. Он принимает запрос, проверяет правила и занятость, возвращает подходящий слот и фиксирует результат. Точная архитектура зависит от конкретной реализации, поэтому интеграцию начинают с контракта данных и проверки ответа.
Краткая схема работы Slotfactory
- Определите, что именно считается слотом: время, ресурс, очередь или комбинация параметров.
- Передайте запрос с идентификатором ресурса, интервалом и ограничениями.
- Проверьте доступность и соответствие бизнес-правилам.
- Зафиксируйте выбранный слот с уникальным идентификатором операции.
- Проверьте итоговый статус, границы интервала и отсутствие конфликта.
- Сохраните корреляционный идентификатор для диагностики.
Что такое Slotfactory: архитектура и назначение
Slotfactory следует понимать как слой управления доступными слотами. Слот описывает конкретную позицию, которую система может предложить или зарезервировать: например, временной интервал специалиста, окно доставки, место в очереди или доступный ресурс.
Типовая система состоит из API, модуля правил, хранилища состояния и механизма подтверждения. API принимает запрос, модуль правил отбрасывает неподходящие варианты, хранилище проверяет занятость, а операция подтверждения предотвращает повторное использование выбранного слота.
Название Slotfactory само по себе не определяет единый стандарт продукта. Перед внедрением нужно установить, является ли это внутренним сервисом, библиотекой или названием конкретного API, а затем проверить его фактическую схему запроса, ответы и правила идемпотентности.
Ключевые компоненты и их взаимодействие
- Источник доступности. Формирует набор свободных интервалов или ресурсов.
- Модуль правил. Учитывает длительность, рабочие часы, ограничения ресурса и исключения.
- Слой подбора. Выбирает варианты по фильтрам запроса и заданному порядку приоритета.
- Хранилище состояния. Содержит статусы слотов: доступен, временно удерживается, подтверждён или отменён.
- Механизм блокировки. Защищает от двойного бронирования при параллельных запросах.
- API-интеграция. Передаёт запросы, результаты, ошибки и идентификаторы операций.
Практический порядок обработки выглядит так: принять запрос, нормализовать даты и часовой пояс, получить кандидатов, применить правила, временно удержать выбранный вариант, вернуть результат и затем подтвердить либо освободить слот.
Модель данных и форматы слотов
Минимальная модель должна однозначно описывать ресурс, интервал, состояние и идентификатор операции. Например:
{
«slot_id»: «slot-123»,
«resource_id»: «resource-7»,
«starts_at»: «2026-09-23T10:00:00+03:00»,
«ends_at»: «2026-09-23T10:30:00+03:00»,
«status»: «available»,
«request_id»: «req-456»
}
На практике модель применяют в нескольких сценариях:
- поиск свободного времени для записи;
- распределение заказов между ресурсами;
- резервирование окна доставки или обслуживания;
- управление очередью обработки задач;
- временное удержание слота до завершения оплаты или подтверждения.
Важные проверки: одинаковый часовой пояс, корректная длительность, запрет отрицательных или пересекающихся интервалов и согласованность статуса с фактической записью в хранилище.
API, протоколы и интеграционные точки
Конкретные маршруты зависят от реализации. Типовой REST-контракт может выглядеть так:
GET /slots?resource_id=resource-7&from=2026-09-23T09:00:00%2B03:00&to=2026-09-23T18:00:00%2B03:00
POST /slots/slot-123/hold
{
«request_id»: «req-456»,
«ttl_seconds»: 300
}
POST /slots/slot-123/confirm
{
«request_id»: «req-456»
}
При интеграции полезны:
- идемпотентный ключ для повторной отправки запроса;
- корреляционный идентификатор для поиска операции в логах;
- явные коды ошибок для занятого, просроченного и неизвестного слота;
- версия API и документированная схема ответа;
- события о подтверждении, отмене и истечении удержания.
Ограничения обычно связаны с задержками между поиском и подтверждением, различиями часовых поясов, повторной доставкой событий и конкурирующими запросами. Результат поиска нельзя считать гарантией бронирования: окончательным является только успешное подтверждение.
Производительность, масштабирование и мониторинг
Производительность определяется объёмом доступных ресурсов, сложностью правил и способом блокировки. Для диагностики фиксируйте время поиска, время удержания, время подтверждения, долю конфликтов и причины отказов.
- Ошибка: проверять слот отдельно, а подтверждать без повторной проверки. Действие: выполнять атомарное удержание или подтверждение.
- Ошибка: смешивать локальное время и UTC. Действие: хранить момент с часовым поясом и явно преобразовывать его на границе системы.
- Ошибка: повторять запрос без идемпотентности. Действие: передавать постоянный ключ операции.
- Ошибка: считать HTTP-успехом бизнес-успех. Действие: проверять статус операции и содержимое ответа.
- Миф: большой кэш всегда ускоряет бронирование. Проверка: кэшировать поиск можно осторожно, но состояние подтверждения должно быть актуальным.
Практические сценарии внедрения и типовые кейсы
Пример короткой проверки результата после подтверждения:
- Отправить запрос на удержание с уникальным идентификатором.
- Убедиться, что ответ содержит ожидаемый slot_id и статус удержания.
- Подтвердить тот же слот с тем же идентификатором операции.
- Проверить, что итоговый статус равен подтверждённому, а интервал совпадает с исходным запросом.
- Повторить запрос подтверждения и убедиться, что повтор не создаёт вторую бронь.
Псевдокод проверки:
result = hold(slot_id, request_id)
assert result.slot_id == slot_id
assert result.status == «held»
confirmed = confirm(slot_id, request_id)
assert confirmed.status == «confirmed»
assert confirmed.request_id == request_id
Если проверка не проходит, сначала сравните часовой пояс и идентификаторы, затем проверьте срок удержания, конкурентные операции и запись события в журнале.
Разбор типичных проблем при внедрении
Можно ли считать найденный слот уже забронированным?
Нет. Поиск сообщает о доступном варианте, но бронь возникает только после успешного удержания или подтверждения, предусмотренного контрактом.
Зачем нужен отдельный идентификатор запроса?
Он связывает повторные попытки с одной операцией и помогает избежать двойного создания брони при сетевых сбоях.
Что делать при конфликте слотов?
Повторно получить актуальный список, исключить занятый вариант и выполнить операцию с ограниченным числом повторов. Бесконечные повторы маскируют ошибку конкуренции.
Как проверять даты и часовые пояса?
Перед отправкой нормализуйте даты, передавайте смещение или UTC и сравнивайте преобразованное значение с ответом сервиса.
Какие поля обязательно проверять в ответе?
Идентификатор слота, идентификатор операции, статус, начало и конец интервала, а также код или описание ошибки при неуспешной операции.
Как диагностировать повторное подтверждение?
Сравните идемпотентный ключ, идентификатор слота и записи журнала. Повтор того же запроса должен вернуть согласованный результат, а не создать новую операцию.