« Grimper » est le mot magique. Tout le monde veut créer le prochain Facebook ou WhatsApp. Mais lorsque le trafic augmente réellement, la plupart des systèmes s’effondrent.
Créer un logiciel évolutif ne consiste pas à utiliser les outils les plus récents ; Il s'agit de concevoir un système qui peut évoluer sans avoir besoin d'être réécrit à partir de zéro pour chaque multiplication par 10 du nombre d'utilisateurs.
Dans ce guide, nous explorerons les meilleures pratiques architecturales pour les systèmes qui doivent être mis à rude épreuve.
1. Couplage lâche
Imaginez un train où tous les wagons sont soudés ensemble. Si un wagon déraille, le train tout entier tombe. Il s'agit d'un système couplé (Rigid Monolith).
Pour évoluer, vous avez besoin d’un découplage.
- Communication asynchrone : au lieu que "Service A" appelle "Service B" et attende une réponse (verrouillant le thread), il envoie un message à une file d'attente (RabbitMQ, Kafka). Le « Service B » le traite quand il le peut.
- Avantage : si le service B tombe en panne ou ralentit, le service A continue de fonctionner et de mettre les messages en file d'attente. Le système ne fonctionne pas en cascade.
2. Base de données : le grand goulot d'étranglement
Dans 90 % des cas, le système n'évolue pas car la base de données est tombée en panne.
- Partage : divisez vos données sur plusieurs serveurs. Les utilisateurs A-M sont sur le serveur 1, N-Z sur le serveur 2. Instagram fait cela.
- CQRS (Command Query Responsibility Segregation) : Séparez le modèle de lecture du modèle d'écriture.
- Pour écrire (INSERT), utilisez une base de données relationnelle robuste (PostgreSQL).
- Pour lire (SELECT), utilisez une version dénormalisée et rapide (Elasticsearch ou Mongo).
3. Apatridie
Si vous disposez de 100 serveurs, chacun d’entre eux devrait pouvoir servir n’importe quel utilisateur.
- Règle : Ne stockez jamais la "Session" dans la mémoire RAM du serveur.
- Solution : stockez l'état sur le client (JWT Token) ou dans une banque de cache externe (Redis).
- Résultat : Vous pouvez désactiver 50 serveurs et en activer 50 nouveaux sans déconnecter aucun utilisateur. Cela active Auto-Scaling (mise à l'échelle automatique dans le cloud).
4. Cache en couches
La requête la plus rapide est celle qui n'atteint même pas base de données.
- Cache du navigateur : le navigateur de l'utilisateur stocke les images et le CSS.
- CDN (Cloudflare) : stocke le contenu statique en périphérie.
- Cache d'application (Redis) : stocke les résultats des requêtes fréquentes.
Une stratégie de mise en cache agressive est le secret de sites comme Reddit et Twitter.
5. Dégradation gracieuse
À grande échelle, les choses vont se briser. Les disques durs brûlent, les câbles sont coupés. Votre système doit être prêt à échouer partiellement.
- Exemple Netflix : si le service « Recommandations personnalisées » tombe en panne, Netflix ne tombera pas en panne. Il affiche une liste statique de « Films populaires ». L'utilisateur ne se rend même pas compte qu'il y a eu une panne critique dans le backend.
Conclusion
L'évolutivité n'est pas un « bouton » sur lequel vous appuyez. C'est une discipline de conception. Cela nécessite de réfléchir aux files d'attente, aux caches, aux pannes et au partitionnement dès le premier jour. Si vous construisez votre logiciel en supposant qu'il tombera en panne, il évoluera probablement bien mieux que si vous supposiez que tout fonctionnera parfaitement.
A lire aussi
-Architecture logicielle évolutive - Meilleures pratiques pour les startups -Architecture logicielle évolutive - Meilleures pratiques pour les petites équipes
