Как 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модели) в параметрах задания. Задание может просто ошибиться из-за того, что она не является сериализуемой. Даже если сериализуются, ваши данные могут быть устаревшими или неактуальными к моменту выполнения функции.
Сохраните идентификаторы заданий, чтобы можно было посмотреть состояние задания: это позволяет определить, находится ли задание в процессе выполнения.