Choreography: services react to events, no central coordinator
coreadvancedIn a choreographed saga, there is no single component directing the workflow — each service completes its own local transaction and publishes a domain event describing what happened, and other services subscribe to those events and react by running their own local transactions in turn, publishing their own events afterward. The overall workflow emerges from this chain of event reactions rather than being explicitly controlled by any one place; no service needs to know the full sequence of steps, only which events it should react to and which event it should publish when it is done.
Think of it as
A choreographed dance has no single director calling out every dancer's move in real time — each dancer has learned their own part and reacts to specific cues from the music or from what another dancer just did, and the overall performance emerges from all of those individual, decentralized reactions happening in the right sequence. No single dancer holds a master script of the whole performance; each one only needs to know their own cues and their own moves. A choreographed saga works the same way — each service only needs to know which events to listen for and which event to publish when its own step finishes, not the shape of the entire workflow.
What we're doing: Trace an order-placement choreographed saga through 4 services reacting to each other's events, with no central coordinator.
- 3
- This is the entire coordination mechanism — an event, not a direct call to the next service in line.
- 20
- This is the defining property of choreography — the full workflow only exists as the emergent sum of 4 independent, locally-scoped reactions.
Why this works: This trace shows exactly what "no central coordinator" means concretely — every transition happens because a service reacted to an event it was already subscribed to, not because anything told it "now do step 3."
Losing track of the overall workflow because no single place documents it
Wrong
Better
What you see: A new engineer (or even an experienced one debugging an incident) cannot answer "what happens after an order is placed" without individually reading through 6 different services' event-subscription code, because choreography's decentralization means the full workflow was never written down anywhere as a single artifact.
Why: Choreography's core strength — no single service needs to know the whole flow — is also its core documentation risk, because nothing forces the whole flow to be written down anywhere either; without a deliberately maintained diagram or specification outside the code, the only way to reconstruct the full picture is to read every participating service.
- Order service — creates the order
- leads to Payments service (OrderPlaced)
- Payments service — charges the card
- leads to Inventory service (PaymentCharged)
- Inventory service — reserves the item
- leads to Shipping service (InventoryReserved)
- Shipping service — schedules shipment
What each service knows and does in a choreographed saga
Remember: Choreography: each service commits its own local transaction and publishes an event; other services react by subscribing to relevant events and running their own local transactions in turn. No service holds the full workflow — it emerges from the chain of reactions, which keeps individual services decoupled but makes the end-to-end flow harder to see in one place.
See also: orchestration · compensating actions and failure handling · sync vs async messaging

