Есть ли способ обслуживать приложение Django, используя предварительную загрузку, ASGI и SO_REUSEPORT?

Я не могу найти способ обслуживать наше большое приложение Django, используя все три варианта: preload, ASGI и SO_REUSEPORT.

Без предварительной загрузки и форка мы используем гораздо больше памяти (гигабайты).

Без ASGI мы не можем обслуживать веб-сокеты (а запуск еще одного сервера только для веб-сокетов нарушил бы наши ограничения по памяти).

Без SO_REUSEPORT мы можем запустить несколько рабочих с предварительной загрузкой/форком, но трафик сильно (на 70 %) смещается в сторону одного рабочего, что сводит на нет большую часть преимуществ.

В настоящее время мы используем рабочие gunicorn + uvicorn для достижения предварительной загрузки + ASGI. У Gunicorn есть невыпущенный режим reuse_port, который, похоже, ничего не делает при использовании gunicorn + uvicorn.

Мы рассматривали возможность использования granian или самого uvicorn в качестве менеджера процессов, но ни тот, ни другой не поддерживают preload/fork и поэтому не будут работать из-за нехватки памяти.

Оказывается, что unicorn HEAD + uvicorn worker выполняет работу с reuse_port=True, поэтому возможно выполнить все три функции ASGI, preload и SO_REUSEPORT. Когда вы будете тестировать свои настройки, убедитесь, что вы отключили HTTP keepalives, иначе по этой причине вы будете использовать только одного работника, поэтому я изначально думал, что новая опция reuse_port=True не сработала.

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