Назад | Перейти на главную страницу

Конфигурация Nginx для длительных задач

У меня есть веб-приложение, которое выполняет некоторый лингвистический анализ текстов, отправленных пользователями. Это довольно интенсивная задача по памяти и обычно занимает продолжительное время (например, до 3 минут для обработки 30 файлов). Я использую функцию Django StreamingHttpResponse для выполнения этой работы, но заметил, что nginx отбрасывает запрос пользователя после обработки примерно 7 файлов (менее 50 секунд). Я попытался настроить параметры keep_alive для nginx и Gunicorn, но, похоже, это не сработало. Интересно, может ли кто-нибудь здесь дать мне какие-нибудь указания по этому поводу?

Мне также интересно, как лучше всего решить задачу, на выполнение которой уходит много времени? Асинхронно?

Я вижу, что никто не ответил, поэтому я набрал ваш вопрос в Google и нашел эта страница. Вы пытались увеличить все применимые тайм-ауты, как это предлагает? Кажется, это первое, что нужно сделать.

I'm also wondering what is the best approach to tackle a task that takes a long time to compute? Asynchronously?

Для этого нужны рабочие очереди. Вам следует рассмотреть возможность отделения отправки файлов от обработки. Позвольте пользователю отправить файлы, сохранить их, добавить сообщение в рабочую очередь для их обработки, действительно асинхронно. Пользователь занимается своим делом, может видеть экран загрузки, но он больше не связан с этим веб-сеансом.

Между тем, отдельный процесс выбирает новые задачи из рабочей очереди, обрабатывая каждую независимо от того, что делает пользователь. Таких систем очередей много, например Amazon AWS SQS:

https://aws.amazon.com/sqs/