tadata
Retour à l'accueil

Patterns et Anti-Patterns des Microservices

#microservices#architecture#api#distributed-systems

Les microservices promettent le déploiement indépendant, l'autonomie des équipes et la flexibilité technologique. Ils apportent aussi la complexité des systèmes distribués, la non-fiabilité du réseau et une charge opérationnelle élevée. Connaître les bons patterns -- et éviter les anti-patterns -- sépare les implémentations réussies des monolithes distribués.

Stratégies de décomposition

Comment vous découpez un monolithe compte plus que le fait de le découper.

StratégieApprocheQuand l'utiliser
Par capacité métierAligner les services sur les domaines métierFrontières de domaine stables
Par sous-domaine (DDD)Utiliser les bounded contexts du DDDDomaines complexes avec séparations claires
Strangler figExtraire progressivement des services du monolitheMigration incrémentale
Par équipeUn service par équipe (loi de Conway inverse)Alignement organisationnel

Communication inter-services

PatternProtocoleCas d'usageCompromis
REST synchroneHTTP/JSONOpérations CRUD simplesCouplage fort, pannes en cascade
gRPC synchroneHTTP/2 + ProtobufAPIs internes haute performanceGestion de schémas, moins lisible
Messaging asyncAMQP, KafkaWorkflows event-drivenConsistance éventuelle, debug plus difficile
Request-reply asyncIDs de corrélation sur filesOpérations longuesComplexité de suivi

Le pattern Saga pour les transactions distribuées

Les transactions ACID classiques ne couvrent pas plusieurs services. Le pattern saga coordonne les opérations multi-services :

Saga basée sur la chorégraphie :

  • Chaque service publie des événements et écoute ceux des autres
  • Pas de coordinateur central
  • Simple pour 2-3 services, complexe au-delà

Saga basée sur l'orchestration :

  • Un orchestrateur central dirige le workflow
  • Chaque service expose une action compensatoire pour le rollback
  • Plus facile à comprendre, mais l'orchestrateur concentre la logique
AspectChorégraphieOrchestration
CouplageFaibleMoyen (vers l'orchestrateur)
VisibilitéFlux difficile à tracerDéfinition de workflow claire
Complexité à l'échelleCroît exponentiellementCroît linéairement
Idéal pourWorkflows simplesProcessus multi-étapes complexes

Service Mesh

Un service mesh gère les préoccupations transversales au niveau infrastructure :

  • Gestion du trafic -- routage, load balancing, déploiements canary
  • Sécurité -- TLS mutuel, politiques d'autorisation
  • Observabilité -- tracing distribué, métriques, logs d'accès
  • Résilience -- retries, circuit breakers, timeouts

Options populaires : Istio (riche, complexe), Linkerd (léger, plus simple), Consul Connect (écosystème HashiCorp).

Anti-patterns critiques

Anti-PatternSymptômeCorrection
Monolithe distribuéLes services doivent être déployés ensembleAppliquer des contrats d'API, réduire les BDD partagées
BDD partagéePlusieurs services écrivent dans les mêmes tablesUne BDD par service, événements pour la sync
Services bavardsCentaines d'appels inter-services par requêteAPIs agrégées, pattern BFF
Nano-servicesServices trop petits pour justifier l'overheadFusionner les services liés
Service dieuUn service gère trop de logiqueDécomposer par bounded context
Chaine synchroneA appelle B appelle C appelle D en synchroneMessaging async, event-driven

Quand le monolithe est préférable

  • Petite équipe (< 10 ingénieurs) -- la charge opérationnelle dépasse les bénéfices
  • Produit en phase initiale -- les frontières de domaine ne sont pas encore claires
  • Domaine simple -- les apps CRUD n'ont pas besoin de complexité distribuée
  • Faible échelle -- si un seul serveur gère la charge, ne la distribuez pas
  • Latence stricte -- chaque saut réseau ajoute de la latence

Un monolithe modulaire bien structuré peut offrir la plupart des bénéfices organisationnels des microservices sans la taxe systèmes distribués.

Ressources

Nous utilisons des cookies analytiques pour améliorer votre expérience. Aucune donnée personnelle n'est collectée.