Skip to content
Learni
Voir tous les tutoriels
Architecture Logicielle

Comment implémenter le pattern Saga en 2026

Read in English

Introduction

Dans un monde où les architectures microservices dominent, gérer des transactions qui traversent plusieurs services pose un défi majeur. Contrairement aux bases de données monolithiques qui garantissent l'ACID (Atomicité, Cohérence, Isolation, Durabilité), les systèmes distribués doivent composer avec des échecs partiels, des réseaux instables et l'absence de transactions globales. C'est ici qu'intervient le pattern Saga, une approche élégante pour orchestrer des séquences d'opérations locales tout en assurant la cohérence globale via des actions de compensation.

Introduit par Cay S. Horstmann en 1994 et popularisé par les frameworks comme Axon ou NServiceBus, le pattern Saga divise une transaction longue en 'sagas' – des unités atomiques exécutées séquentiellement. Si une étape échoue, des compensations inversent les étapes précédentes, comme un 'Ctrl+Z' distribué. En 2026, avec l'essor de l'event sourcing et du CQRS, les Sagas sont incontournables pour des flux comme les réservations de vols+hôtels ou les paiements multi-fournisseurs. Ce tutoriel conceptuel vous guide pas à pas, de la théorie aux bonnes pratiques, pour implémenter des Sagas robustes sans code, en vous armant de concepts actionnables que tout architecte senior bookmarkera.

Prérequis

  • Connaissances solides en microservices et communication asynchrone (événements, queues comme Kafka ou RabbitMQ).
  • Familiarité avec les principes CQRS (Command Query Responsibility Segregation) et Event Sourcing.
  • Compréhension des transactions ACID vs BASE (Basically Available, Soft state, Eventual consistency).
  • Expérience en gestion d'erreurs distribuées (retry, circuit breaker).

Les fondations du pattern Saga

Le pattern Saga répond au problème des transactions distribuées longues (Long Lived Transactions, LLT). Imaginez une commande e-commerce : vérifier stock → débiter paiement → expédier. Un échec au paiement invalide tout sans bloquer les services.

Définition clé : Une Saga est une séquence d'opérations locales, chacune avec une action principale et une compensation.

ÉtapeActionCompensation
-----------------------------
1Réserver stockAnnuler réservation
2Débiter paiementRembourser
3Confirmer expédition? (irréversible)
Analogie : Comme un orchestre où le chef (Saga) coordonne les musiciens (services). Pas de rollback global, mais un 'rewind' sélectif. Avantage : Résilience aux pannes, scalabilité horizontale.

Saga d'orchestration vs chorégraphie

Deux implémentations principales distinguent les Sagas.

Orchestration centralisée :

  • Un orchestrateur (service dédié ou framework comme Camunda, Temporal) pilote la séquence.
  • Flux : Orchestrateur → Service A (action) → Événement de succès → Orchestrateur → Service B...
  • Avantages : Facile à déboguer, état centralisé, timeouts gérés.
  • Inconvénients : Point de défaillance unique, couplage.

Chorégraphie décentralisée :
  • Chaque service publie des événements (via broker événementiel) ; les autres réagissent.
  • Flux : Service A action → Événement 'StockRéservé' → Service B débite → 'PaiementOK' → Service C expédie.
  • Avantages : Décentralisé, résilient, faible couplage.
  • Inconvénients : État distribué dur à tracer, idempotence requise.

Choix : Orchestration pour workflows complexes, chorégraphie pour systèmes matures.

Gestion des compensations et idempotence

Compensations : Chaque action doit être inversible. Pas toujours possible (ex: envoi email), d'où des 'compensations partielles' ou tolérance.

Étapes critiques :

  1. Définir le contrat : Action + Compensation + Événements de saga (SagaStarted, SagaCompensated).
  2. Idempotence : Actions/compensations tolèrent les redéploiements (UUID saga + versionning).
  3. Timeouts et retries : Saga expire après X temps ; retry exponentiel sur échecs transitoires.

Cas concret : Réservation vol+hôtel.
  • Saga ID : 'voyage-123'.
  • Échec hôtel → Compenser vol (annuler) + notifier client.

Saga state machine : Modélisez comme un automate fini (états : Initial, Step1Done, Compensating).

Cas d'étude : Commande e-commerce

Appliquons à une commande : Services : Stock, Paiement, Livraison.

Orchestration :

  1. Saga démarre : Réserver stock (ok).
  2. Débiter paiement (échec réseau).
  3. Compenser : Libérer stock.

Chorégraphie :
  • StockRéservé → Paiement écoute, débite → PaiementOK → Livraison prépare.
  • Si timeout sur PaiementOK, Livraison compense Stock.

Métriques : Taux de succès Saga >99%, temps moyen 2s. Outils : Suivi via Jaeger pour tracing distribué.

Bonnes pratiques

  • Modélisez d'abord : Dessinez la state machine avec tous chemins (succès, échecs, timeouts) via PlantUML ou Draw.io.
  • Événements enrichis : Incluez SagaID, Step, Reason dans chaque événement pour tracing.
  • Saga comme agrégat : Stockez l'état Saga en Event Sourcing (projections pour queries).
  • Testez exhaustivement : Chaos engineering (injecter pannes) + property-based testing pour idempotence.
  • Limitez la profondeur : Max 7 étapes ; décomposez en Sagas imbriquées si plus.

Erreurs courantes à éviter

  • Oublier l'idempotence : Redéclenchements causent doubles débits ; toujours vérifier 'already processed'.
  • Compensations non testées : Actions irréversibles bloquent ; priorisez 'outbox pattern' pour fiabilité.
  • État perdu : Pas de persistance Saga → recommencer à zéro ; utilisez DB ou Kafka streams.
  • Sur-orchstration : Centraliser tout crée bottleneck ; hybridez avec chorégraphie pour scalabilité.

Pour aller plus loin

Approfondissez avec :

  • Frameworks : Temporal.io (orchestration), Eventuate (Saga Tram), Axon Framework.
  • Lectures : 'Building Microservices' de Sam Newman (chap. Transactions), docs Kafka Streams.
  • Ressources : Tutoriel Temporal en français, articles sur DDD Tactical Patterns.

Découvrez nos formations Learni sur l'architecture microservices pour des ateliers pratiques.