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 / seconde | Actions à mettre en place |
---|---|
100 | Implé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 | |
1000 | Ajoutez des réplicas en lecture |
Implémentez du caching fragmenté | |
Déplacez vos instances Redics / Memcache vers du managé | |
10,000 | Shards 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 :
- Réaliser des requêtes N+1 vers d’autres objets,
- Ajouter un couplage supplémentaire directement au niveau des propriétés,
- 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.