Aller au contenu

Scaling

Lorsque votre application aura grandi, il sera nécessaire de la faire évoluer et de trouver les goulets d’étranglements :

  • Requêtes en base de données,
  • Rendu des templates,
  • Temps de traitement de l’interpréteur,
  • Manquements au cache,
  • I/O disque,
  • Latence réseau.

https://slimsaas.com/blog/django-scaling-performance

Concrètement :

# de requêtes / secondeActions à mettre en place
100Implémentez un mécanisme de caching (basique)
Ajoutez des indexes au niveau de la base de données
Déplacez vos fichiers statiques vers un CDN
1000Ajoutez des réplicas en lecture
Implémentez du caching fragmenté
Déplacez vos instances Redics / Memcache vers du managé
10,000Shards databases
Implémentez du caching au niveau service
Considérez un refactoring en micro-services pour les opérations lourdes

Fat models / thin views

Une des recommandations que l’on peut lire pour django consiste à créer des fat models et à conserver des thin views, c’est-à-dire à compléter le maximum d’informations directement au niveau du modèle et sortir le maximum de règles métiers des vues. Le soucis, c’est que l’on arrive rapidement à créer des classes de plusieurs centaines de lignes, qui dialoguent directement avec la base de données, et qui pourraient potentiellement :

  1. Réaliser des requêtes N+1 vers d’autres objets,
  2. Ajouter un couplage supplémentaire directement au niveau des propriétés,
  3. Complexifier la maintenance générale de l’application, sous couvert d’une facilité ponctuelle et immédiate.

“The https://news.ycombinator.com/item?id=23322880[“Fat Models” recommendation] is one of the most destructive in my opinion, along with Django Rest Framework “Model Serializers”. A JSON serializer that talks directly to the database is just madness.” — https://news.ycombinator.com/item?id=23322880

La proposition consiste à créer des services qui viennent se glisser entre les vues et les managers.

De cette manière, nous :

  • Conservons le principe de thin views
  • Ajoutons un concept intermédiaire, entre ces vues et les managers, afin de limiter la maintenance des requêtes, mais aussi
  • Gardons les managers comme couche d’accès à la base de données,
  • Conservons des modèles cohérents, dans lesquels il serait logique de trouver une propriété spécifique,
  • Gardons les modèles à la frontière entre la représentation mentale d’un concept et sa presistance.