Как Django обрабатывает длинный запрос в другом запросе?

Проблема с обработкой длинного запроса (50 секунд) в другом запросе (3 секунды).

У меня есть POST запрос, который вернет некоторую информацию для пользователя, в этом запросе будет вызван другой api в том же приложении и он будет запрашивать базу данных и генерировать pdf отчет, затем загружать на s3, это будет стоить около 50 секунд.

Как я могу позволить первому запросу возвращать информацию пользователю и генерировать pdf api в фоновом режиме?

Я провел некоторые исследования, обнаружил, что сельдерей может справиться с этой задачей, рекомендуется ли это? Или у кого-нибудь есть совет?

Заранее спасибо!!!

Да, именно здесь вы могли бы применить такие решения, как celery, rq или huey.

В бэкенде вы будете использовать сервер типа redis, который хранит состояние заданий, которые вы запланировали (и если они ошиблись).

Из трех вышеперечисленных я настоятельно рекомендую сельдерей. Он существует дольше и имеет лучшую телеметрию по таким сервисам, как sentry и Scout APM.

Для начала работы, вот ссылка на First steps with Django на сайте документации celery и его sample django project на GitHub.

Вхождение в курс дела

  • Данные сериализованы

    Это означает, что для транспортировки данных содержимое будет пикировано или закодировано в json

    .
  • Передача идентификаторов объектов / наивных данных запланированным функциям

    .
    • Хорошо: book_id как str, затем искать Book.objects.get(pk=book_id) внутри запланированной функции. Даже если это означает выполнение избыточного запроса - по крайней мере, это свежие данные, на которые можно положиться.

      .
    • Опасно: Передача экземпляра модели (например, book из Book модели) в параметрах задания. Задание может просто ошибиться из-за того, что она не является сериализуемой. Даже если сериализуются, ваши данные могут быть устаревшими или неактуальными к моменту выполнения функции.

  • Сохраните идентификаторы заданий, чтобы можно было посмотреть состояние задания: это позволяет определить, находится ли задание в процессе выполнения.

Вернуться на верх