Explainstuff.mebeta
All concepts
Cloud Native Patternsintermediate6 min

Choreography

Let each service react to events on its own instead of taking orders from a central conductor.

Think about how a dinner party actually runs. Nobody stands in the kitchen barking "now chop the onions, now you pour the wine, now you set the table." Instead each person watches what's happening and reacts: the smell of garlic tells the wine-pourer it's nearly time, an empty plate tells someone to clear it. There's no conductor — just people responding to signals. That's choreography.

The problem

When a business process spans several services — say, processing an order across inventory, payment, and shipping — something has to drive the steps. The obvious move is a central orchestrator: one service that calls inventory, waits, calls payment, waits, calls shipping. It works, but now every step depends on that one coordinator. It becomes a bottleneck, a single point of failure, and a place where the logic for every workflow piles up. Each service also ends up tightly coupled to the orchestrator's view of the world, so changing one step often means redeploying the brain in the middle.

The before: one conductor everyone depends on
command, then wait
Orchestrator
Inventory
Payment
Shipping
Notify
A central orchestrator calls each service in turn and waits. It becomes the bottleneck, the single point of failure, and the place every workflow's logic accumulates.

How it works

In choreography there is no central brain. Each service does its piece of work, then publishes an event announcing what it did — OrderPlaced, PaymentCaptured, OrderShipped. Other services subscribe to the events they care about and react. The order service emits OrderPlaced; inventory hears it, reserves stock, and emits StockReserved; payment hears that and charges the card; shipping reacts to PaymentCaptured. The workflow emerges from this chain of reactions, usually over a pub/sub bus or message broker. The diagram below traces an event rippling from one service to the next, with nobody in the middle telling anyone what to do.

No conductor — services react to events
event
Order
Event Bus
Inventory
Payment
Shipping
Each service reacts to an event and emits its own. The workflow emerges from the chain, with nobody in the middle directing it.
Tip

Emit facts, not commands. A good choreography event says what happened (PaymentCaptured) rather than what to do next (StartShipping). Facts let new consumers join later without the publisher knowing about them, while commands quietly recreate the central-coordinator coupling you were trying to escape.

When to use it

Choreography is a great fit when the workflow is simple and fairly stable, when you want services to stay loosely coupled and scale independently, and when you're already building on event-driven architecture. It's the natural coordination style for a saga that values autonomy over central control, and it pairs well with competing consumers for scaling each reaction.

Where it hurts is visibility. Because no single component owns the flow, understanding or debugging the end-to-end process means tracing events across many services. For complex workflows with lots of branching, or when you need one place to monitor and reason about the whole thing, orchestration is usually the kinder choice.

Key takeaways

  • Choreography spreads workflow logic across services: each one reacts to events and emits its own, with no central coordinator.
  • It keeps services loosely coupled and lets them scale and deploy independently — the opposite of an orchestrator everyone depends on.
  • The flip side is that the end-to-end flow is implicit. No single place tells you what the whole process does.
  • Events should be facts about what happened, and consumers must be idempotent because events get redelivered.
  • Choreography shines for simple, stable flows; reach for orchestration when the workflow is complex or needs central monitoring.

Keep going