Je me demandais quelle était la bonne approche pour déployer une application Django conteneurisée en utilisant gunicorn et celery.
Plus précisément, chacun de ces processus dispose d'une méthode intégrée de mise à l'échelle verticale, en utilisant les éléments suivants workers
pour gunicorn et concurrency
pour le céleri. Et puis il y a l'approche Kubernetes de la mise à l'échelle en utilisant replicas
Il y a aussi cette notion de fixer des travailleurs égaux à une certaine fonction des CPUs. Gunicorn recommande
2-4 travailleurs par noyau
Cependant, je ne sais pas comment cela se traduit sur les K8 où le CPU est une ressource partagée divisible - à moins que j'utilise resoureceQuotas.
Je veux comprendre quelle est la meilleure pratique. Il y a trois options qui me viennent à l'esprit :
- Avoir des travailleurs uniques pour gunicorn et une concurrence de 1 pour celery, et les faire évoluer en utilisant les répliques ? (mise à l'échelle horizontale)
- Faites fonctionner gunicorn et celery dans un déploiement unique de répliques avec une mise à l'échelle interne (mise à l'échelle verticale). Cela implique de définir des valeurs assez élevées pour les travailleurs et la concurrence respectivement.
- Une approche mixte entre 1 et 2, où nous exécutons gunicorn et celery avec une petite valeur pour les travailleurs et la concurrence, (disons 2), puis utilisons les répliques de K8s Deployment pour évoluer horizontalement.
Il y a quelques questions sur SO à ce sujet, mais aucune n'offre une réponse approfondie/réfléchie. J'apprécierais que quelqu'un partage son expérience.
Note : Nous utilisons la classe de travail par défaut. sync
pour Gunicorn