Мне было интересно, какой правильный подход к развертыванию контейнерного приложения Django с использованием gunicorn & celery был.
В частности, каждый из этих процессов имеет встроенный способ масштабирования по вертикали, используя workers
для пушки и concurrency
для сельдерея. И тогда есть подход Кубернеса к масштабированию с использованием replicas
Существует также понятие о том, что работники равны некоторой функции процессоров. Гуникорн рекомендует
2-4 рабочих на ядро
Однако я смущен тем, что это означает для K8s, где ЦП - это делимый общий ресурс - если только я не использую resoureceQuotas.
Я хочу понять, что такое "Лучшая практика". Есть три варианта, о которых я могу думать:
- Имеют ли одинокие рабочие для пушки и параллелизма 1 для сельдерея и масштабируют их с помощью реплик? (горизонтальное масштабирование)
- Попробуйте использовать пушки и сельдерей в одном реплике с внутренним масштабированием (вертикальное масштабирование). Это означало бы установление довольно высоких значений рабочих и параллелизма соответственно.
- Смешанный подход между 1 и 2, где мы запускаем пушки и сельдерей с небольшой стоимостью для рабочих и параллелизма (скажем, 2), а затем используем реплики развертывания K8s для горизонтального масштабирования.
Есть несколько вопросов по поводу этого, но никто не предлагает углубленного/продуманного ответа. Был бы признателен, если кто-то может поделиться своим опытом.
Примечание. Мы используем стандартную sync
employee_class для Gunicorn