Saga Choreography
Une saga sans chef d'orchestre — chaque service réagit aux événements du domaine et émet les siens. Adapté aux cycles EDI partenaires autonomes, là où la Saga Orchestration imposerait un coordinateur centralisé.
Problème
Un cycle EDI ORDERS → ORDRSP → DESADV → INVOIC → REMADV traverse plusieurs services internes (Achats, Logistique, Facturation, Trésorerie) qui sont autonomes et déjà découplés par messagerie. Imposer un orchestrator centralisé ajoute un point de couplage et un goulot d'étranglement : chaque étape doit signaler son achèvement à l'orchestrator, qui doit décider de l'étape suivante. Pourquoi ne pas laisser chaque service réagir directement à l'événement précédent ?
Forces
- Pas de service central. La saga vit dans l'interaction d'événements ; aucune équipe ne possède le workflow complet.
- Couplage faible. Chaque service ne connaît que les événements qu'il consomme et émet, pas la séquence globale.
- Mais le workflow se dissimule. Comprendre la séquence end-to-end demande de lire le code de tous les services.
- Cycle de dépendances possible. Si A réagit à B qui réagit à C qui réagit à A, on peut boucler sans s'en rendre compte.
Solution
Chaque service de domaine est abonné aux événements pertinents et
émet les siens en retour. Les compensations sont déclenchées par des
événements inverses (OrderCancelled, ShipmentRecalled) qui chaque service consomme s'il a
réalisé l'effet correspondant. Aucun service ne possède la séquence
complète ; elle émerge de la composition.
[Buyer service] reçoit ORDERS d'un fournisseur
│
├─emit─► OrderAccepted(orderId=ORD789) ─► topic: orders
│
[Supplier service] consomme OrderAccepted
├─emit─► ORDRSP envoyé au partenaire EDI ─► topic: order-responses
│
[Logistics service] consomme OrderAccepted, prépare expédition
├─emit─► ShipmentDispatched(asn=ASN9001) ─► topic: shipments
├─send─► DESADV au partenaire
│
[Billing service] consomme ShipmentDispatched (+ trigger temps)
├─emit─► InvoiceIssued(invoice=INV-7811) ─► topic: invoices
├─send─► INVOIC au partenaire
│
[Treasury service] consomme InvoiceIssued + ReceiptConfirmed
├─emit─► PaymentRemitted(amount=1240.00) ─► topic: payments
└─send─► REMADV au partenaire
Compensation = chaque service expose un handler pour les événements
inverses (OrderCancelled, ShipmentRecalled, InvoiceCredited). Implémentation EDI
Cas concret EDI : l'orchestration d'un cycle PO ↔ ASN ↔ INVOIC ↔
REMADV. Le service Buyer reçoit l'ORDERS d'un partenaire, le
valide, publie un événement OrderAccepted sur le topic
Kafka orders. Le service Supplier consomme, émet
un ORDRSP et publie OrderConfirmed. Le service Logistics consomme OrderAccepted, prépare
l'expédition et publie ShipmentDispatched — il émet
aussi le DESADV au partenaire EDI. Le service Billing
consomme ShipmentDispatched et émet l'INVOIC. Le service Treasury attend le ReceiptConfirmed de la
réception RECADV, déclenche le règlement et émet le REMADV. Aucun
composant ne possède le workflow complet ; il vit dans la grille
des abonnements Kafka.
Choreography vs Orchestration
Les deux variantes de Saga (Choreography, Orchestration) sont complémentaires :
- Choreography convient aux workflows à 3-5 étapes stables et bien comprises, dans des organisations matures découpées en bounded contexts.
- Orchestration convient aux workflows complexes, changeants, ou avec branches conditionnelles fines, où la lisibilité du workflow prime sur le découplage.
- Souvent les deux coexistent : choreography entre domaines, orchestration interne à un domaine.
Anti-patterns
- Workflow caché dans 10 services. Sans cartographie des événements, plus personne ne comprend le cycle bout-en-bout après 18 mois.
- Boucle non détectée. Service A produit X, B réagit en produisant Y qui fait que A produit X — la chaîne explose.
- Compensations partielles. Un service oublie de
consommer
OrderCancelled: la commande reste annulée dans 4 services sur 5, ce qui rend l'état incohérent. - Pas de TraceId transverse. Sans identifiant de corrélation propagé dans tous les événements, l'investigation d'incident devient une chasse au trésor.
Patterns liés
- Saga Orchestration — la variante avec orchestrator central.
- Process Manager — concept parent.
- Event Message — le style de message naturel de la choreography.
- Correlation Identifier — indispensable pour tracer la saga.
Sources
- Garcia-Molina H., Salem K. — Sagas, ACM SIGMOD 1987. dl.acm.org/doi/10.1145/38713.38742
- Richardson C. — Microservices Patterns, Manning 2018, chap. 4 « Managing transactions with sagas ». microservices.io/patterns/data/saga.html
- Microsoft — Saga distributed transactions pattern. learn.microsoft.com — Saga
- Nygard M. — Release It!, Pragmatic Bookshelf 2018, sur le couplage faible et les patterns d'événements.