Performance et Passage à l'Échelle
Vue d'Ensemble
La performance est une fonctionnalité avec un budget. Mesurez-la, bornez-la, et respectez que les comportements d'aujourd'hui deviennent les contrats de demain. Les systèmes tombent rarement au débit pour lequel vous les avez conçus — ils tombent sur la requête que vous n'avez pas indexée et la liste que vous n'avez pas paginée.
Les Principes
- Définissez des budgets et mesurez-les. Cibles de latence (liées aux SLO de
observability-and-slos) et budgets clients (ex. taille de bundle). Une régression au-delà du budget est un bug. - Mesurez avant d'optimiser. Trouvez le vrai goulot d'étranglement avec des données — profils, plans de requête, traces — avant de modifier le code. Pas d'optimisation spéculative.
- Paginer par défaut. Toute liste susceptible de croître est paginée avec une taille de page plafonnée. Les ensembles de résultats non bornés sont un risque de latence et de déni de service.
- Méfiez-vous des motifs d'accès N+1. Les données récupérées en boucle sont la cause la plus fréquente de défaillance de passage à l'échelle ; faites du traitement par lots ou des jointures à la place. (Sur cette pile : utilisez le look-ahead/DataLoader de la couche GraphQL plutôt qu'une résolution par ligne.)
- La loi de Hyrum est réelle : tout comportement observable d'une interface devient un contrat dont quelqu'un dépend dès qu'elle a assez de consommateurs — y compris des comportements que vous n'avez jamais intentionnellement créés (ordre, nullabilité, formes d'erreur, timing). Traitez les interfaces publiques (l'API/schéma en particulier) comme des contrats : ajoutez et dépréciez, ne modifiez pas en silence. Les tests de contrat de
graphql-contract-testingfigent les comportements que vous avez choisis ; la discipline protège ceux que vous n'avez pas choisis.
Référence Rapide
| Symptôme | Correction |
|---|---|
| Requête dans une boucle | Traitement par lots ou jointure ; utiliser le look-ahead |
| Point de terminaison de liste sans limite | Ajouter une pagination plafonnée |
| "Laissez-moi optimiser ça" sans mesure | Profiler d'abord ; trouver le vrai goulot |
| Modifier le type/nullabilité/ordre d'un champ | C'est un changement de contrat — ajouter le nouveau, déprécier l'ancien |
| Pas d'objectif de latence ou de taille de bundle | Définir un budget ; traiter les régressions comme des bugs |
Application : budgets vérifiés en CI là où c'est mécanisable (limites de taille de bundle, limites de coût de requête) ; la pagination et l'évitement des N+1 relèvent du jugement du relecteur, appuyé par des tests de charge et une revue des plans de requête.
Raisonnement complet : Article XI de la constitution, disponible dans engineering-constitution/references/engineering-constitution.md.