Выбор ответа Senior FastAPI и Pydantic обновлено

BackgroundTasks или очередь задач

Вопрос

Нужно после оплаты сгенерировать PDF-счёт (20 секунд) и отправить его на почту, и это нельзя потерять. Что выбрать?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Очередь задач (Celery, arq, Taskiq) с повторами. BackgroundTasks выполняются в том же процессе после ответа: при перезапуске или падении воркера задача пропадёт, ретраев нет, а тяжёлая работа отнимает ресурсы у запросов. createtask ещё хуже: задачу без ссылки может собрать сборщик мусора.

Варианты ответа

  1. BackgroundTasks FastAPI: задача выполнится после ответа
  2. asyncio.create_task в обработчике с сохранением ссылки
  3. Очередь задач (Celery, arq, Taskiq) с повторамиправильный ответ
  4. Синхронно в обработчике до ответа, раз это нельзя потерять

Разбор

BackgroundTasks выполняются в том же процессе после ответа: при перезапуске или падении воркера задача пропадёт, ретраев нет, а тяжёлая работа отнимает ресурсы у запросов. create_task ещё хуже: задачу без ссылки может собрать сборщик мусора. Синхронно 20 секунд держать клиента нельзя. Очередь с брокером даёт надёжность, ретраи и отдельные воркеры. BackgroundTasks подходит для лёгкого и некритичного: записать лог, отправить метрику.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.