Есть ли способ обслуживать приложение 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
не сработала.