Вопрос проверяет, понимаете ли вы, как разделять ответственность между обработкой HTTP-запросов и выполнением фоновых задач, чтобы система была устойчивой и масштабируемой.
Обычно API-сервис отвечает за прием запросов, валидацию, запись данных и постановку задач в очередь, а воркер — за выполнение долгих/тяжелых задач вне HTTP-контекста. Это снижает время ответа API и повышает надежность: задачи можно ретраить и выполнять независимо. Взаимодействие часто строится через брокер сообщений, чтобы компоненты были слабо связаны. Масштабирование достигается добавлением экземпляров воркеров и/или API.
Разделение API и воркеров — это про разные SLO: API важна минимальная задержка, воркерам — пропускная способность и надежная обработка.
Определение: Воркер — процесс/сервис, который забирает задания из очереди и выполняет их вне контекста входящего HTTP-запроса.
API принимает запрос.
Делает минимально необходимое синхронно (проверки, транзакция, сохранение “заказа”).
Публикует задание в очередь.
Воркер потребляет задание и выполняет тяжелую часть.
Почему это хорошо:
API отвечает быстро (не держит соединение во время “долгой работы”).
Воркеры можно масштабировать независимо от API.
Появляются ретраи, DLQ, идемпотентность.
Outbox pattern (рекомендуется, если важно “не потерять сообщение”)
API пишет бизнес-данные и “outbox-событие” в одну БД-транзакцию.
Отдельный паблишер читает outbox и публикует в брокер.
At-least-once обработка (типично для очередей)
Сообщение может прийти повторно, поэтому воркер должен быть идемпотентным.
Saga / choreography (если задач много и есть шаги)
Длинная операция раскладывается на шаги с событиями и компенсирующими действиями.
Минимизируйте payload: передавайте task_id/entity_id, а детали берите из БД.
Версионируйте формат сообщения (например, поле version).
Добавляйте метаданные: trace_id, created_at, attempt.
# API: положили "задачу" в брокер (псевдокод)
message = {"task": "send_email", "user_id": 42, "trace_id": trace_id}
broker.publish("jobs", message)
Разделяйте API и воркеры, когда есть долгие операции, внешние интеграции или пики нагрузки: очередь дает буферизацию, воркеры — независимое масштабирование и контроль надежности.