Concevoir des systèmes capables de gérer des millions d'utilisateurs tout en maintenant performance, fiabilité et maintenabilité.
Définition : Rapidité de traitement d'une requête individuelle.
Définition : Capacité à gérer une charge croissante.
Complémentarité : Un système scalable a besoin de composants performants.
Opposition : La distribution (scalabilité) ajoute de la latence réseau, réduisant la performance brute.
Une seule application, un seul codebase
Services indépendants, communication API
Redis, Memcached, CDN
Réduction I/O disque
Files d'attente, Event-driven
Découplage opérations
Zstd, Brotli, gzip
Réduction bande passante
B-Trees, indexes inversés
Accès O(log n)
Réutilisation connexions
Réduction overhead TCP
Optimisation runtime
Code natif
Identification goulots
Optimisation ciblée
Chargement différé
Réduction initiale
Augmenter la puissance d'une machine
Ajouter plus de machines
Distribuer le trafic entre plusieurs serveurs
Relationnel, ACID
Flexible, BASE
Copies pour haute disponibilité
Partitionnement horizontal
ACID vs BASE
Commande → Kafka → Validation → Paiement → Email (asynchrone)
Containerisation: isolation, reproductibilité, légèreté
Orchestration: scaling auto, rolling updates, service discovery
Chat temps réel
Ride-sharing
Streaming vidéo
"La meilleure architecture évolue avec les besoins"