Orchestration vs Choreography: Two Ways to Coordinate Microservices
Compare orchestration and choreography in microservices, understand how each coordination style works, and learn when to use a central orchestrator, events, or a hybrid approach.
Microservices are rarely as independent as architecture diagrams make them look.
A single checkout might involve an order service, payment service, inventory service, shipping service, notification service, fraud system, and analytics pipeline. Each service owns its own data and behavior, but the user experiences the whole thing as one action: “place order.”
That creates a coordination problem.
Who decides what happens first? Who knows whether the workflow is complete? Who handles failure? Who retries? Who compensates when step three succeeds but step four fails?
Two common answers are orchestration and choreography.
The Short Version
Orchestration uses a central coordinator to direct the workflow.
Choreography lets services react independently to events.
Orchestration:
One coordinator tells services what to do.
Choreography:
Services publish events and react to each other.
Neither is universally better. Orchestration gives you control and visibility. Choreography gives you loose coupling and autonomy. Most mature microservice systems eventually use both.
What Is Orchestration?
Orchestration is a coordination style where one central component controls the workflow.
That component is usually called an orchestrator. It knows the sequence of steps, calls the participating services, tracks progress, handles failures, and decides what should happen next.
Client
|
v
Order Orchestrator
|----> Inventory Service
|----> Payment Service
|----> Shipping Service
|----> Notification Service
The services still own their own business logic. The orchestrator does not need to know how payment authorization works internally or how inventory is stored. Its job is coordination.
For a deeper dive into the pattern itself, see the orchestrator pattern.
What Is Choreography?
Choreography is a coordination style where services communicate through events without a central workflow controller.
Each service listens for events it cares about, performs its own local work, and publishes new events for other services to react to.
OrderCreated
|
+--> Inventory Service reserves stock
|
v
InventoryReserved
|
+--> Payment Service charges card
|
v
PaymentCaptured
|
+--> Shipping Service creates shipment
No single service tells every other service what to do. The workflow emerges from event subscriptions.
This is common in event-driven architectures, where services publish business facts such as OrderCreated, PaymentCaptured, or CustomerUpgraded.
A Checkout Example
Suppose a customer places an order.
The business process needs to:
- Create the order
- Reserve inventory
- Take payment
- Create a shipment
- Send a confirmation email
Both orchestration and choreography can implement this flow. They simply place the coordination logic in different places.
Checkout With Orchestration
In an orchestrated design, an order orchestrator owns the flow.
Create order
|
v
Reserve inventory
|
v
Capture payment
|
v
Create shipment
|
v
Send confirmation
The orchestrator sends commands:
ReserveInventory
CapturePayment
CreateShipment
SendConfirmation
Each service replies with success or failure. The orchestrator decides the next step.
If payment fails, the orchestrator might send a compensating command:
ReleaseInventory
RejectOrder
NotifyCustomer
This makes the workflow easy to see. There is one place to inspect the order’s progress and one component responsible for deciding what happens next.
Checkout With Choreography
In a choreographed design, services react to events.
Order Service:
creates order
publishes OrderCreated
Inventory Service:
hears OrderCreated
reserves stock
publishes InventoryReserved
Payment Service:
hears InventoryReserved
captures payment
publishes PaymentCaptured
Shipping Service:
hears PaymentCaptured
creates shipment
publishes ShipmentCreated
Notification Service:
hears ShipmentCreated
sends confirmation
No central component owns the whole flow. Each service only needs to know which events it consumes and which events it publishes.
This makes each service more autonomous, but the overall process becomes harder to see because the workflow is spread across event handlers.
The Core Trade-Off
Orchestration centralizes coordination.
Choreography distributes coordination.
| Question | Orchestration | Choreography |
|---|---|---|
| Who controls the flow? | A central orchestrator | Participating services |
| How do services communicate? | Commands and replies | Events |
| Where is workflow logic? | Mostly one place | Spread across services |
| Visibility | Easier | Harder without tracing |
| Coupling | Services depend on orchestrator commands | Services depend on event contracts |
| Autonomy | Lower | Higher |
| Failure handling | Centralized | Distributed |
| Best fit | Complex multi-step workflows | Independent event reactions |
The trade-off is not control versus chaos. Both can be designed well or badly. The real question is where the coordination logic should live.
When Orchestration Works Best
Use orchestration when the process has a clear owner and a defined sequence.
Good candidates include:
- Checkout flows
- Payment workflows
- Loan approvals
- Insurance claims
- Order fulfilment
- Subscription provisioning
- Long-running business processes
- Workflows that need human approval
- Processes with compensating actions
- Operations where the current status must be easy to query
Orchestration is especially useful when the business asks:
Where is this order right now?
Why did it stop?
What step failed?
Can support retry it?
Can we show progress to the customer?
If those questions matter, a central workflow record is valuable.
When Choreography Works Best
Use choreography when services can react independently to business events.
Good candidates include:
- Sending emails after an order is placed
- Updating analytics after a user signs up
- Invalidating cache after product data changes
- Updating search indexes after content is published
- Emitting audit records after account changes
- Triggering recommendation updates after purchases
- Informing downstream systems about domain events
These reactions are usually asynchronous and do not need to block the original user action.
For example:
UserSignedUp
-> Email Service sends welcome email
-> Analytics Service records signup
-> CRM Service creates lead
-> Recommendation Service initializes profile
No single orchestrator needs to tell every service to react. The event itself is enough.
Sagas: Where the Debate Often Appears
The orchestration vs choreography discussion often appears when teams implement sagas.
A saga is a way to manage a business transaction that spans multiple services without using one large database transaction. Each service performs a local transaction. If something fails, earlier steps may need compensating actions.
Chris Richardson’s Saga pattern describes both coordination styles:
- Choreography: services publish domain events that trigger other services
- Orchestration: a saga orchestrator tells participants what local transactions to execute
That distinction is the heart of this article. The same business process can be coordinated either way.
Failure Handling
Failure handling feels different in each style.
With orchestration, the orchestrator can keep explicit workflow state:
Order status: payment_failed
Completed steps:
- order created
- inventory reserved
Failed step:
- payment capture
Compensation:
- release inventory
That makes retries, compensation, and support tooling easier to centralize.
With choreography, each service owns its own reaction to failure:
PaymentFailed
-> Inventory Service releases stock
-> Order Service marks order rejected
-> Notification Service tells customer
This can scale well, but the failure path is distributed. You need strong event design, idempotency, observability, and clear ownership.
Observability
Orchestrated workflows are easier to observe because one component sees the whole process.
Choreographed workflows need more deliberate observability because the flow is spread across services and events.
For choreography, you should be especially disciplined about:
- Correlation IDs
- Trace IDs
- Event IDs
- Causation IDs
- Structured logs
- Message timestamps
- Consumer lag metrics
- Dead-letter queues
- Retry counts
Without that, a single business process turns into a scavenger hunt across logs and message brokers.
For the observability pieces, see distributed tracing, correlation ID vs trace ID, and JSON logging best practices.
Coupling Is Different, Not Gone
Choreography is often described as loosely coupled, and that is partly true.
Services do not need to call each other directly. They do not need to know who else is listening. They publish events and move on.
But coupling still exists.
Instead of depending on an API command, services depend on event contracts:
{
"eventType": "OrderCreated",
"orderId": "ord_123",
"customerId": "cus_456",
"total": 89.99
}
If that event changes unexpectedly, consumers can break.
That is why event schemas need versioning and tests. The same contract-drift problem appears in APIs, which is covered in contract testing vs integration testing.
State Management
Orchestration usually gives you one obvious place to store workflow state.
OrderWorkflow
state: awaiting_payment
lastCompletedStep: inventory_reserved
retries: 2
Choreography often stores state across multiple services.
Order Service:
order status
Inventory Service:
reservation status
Payment Service:
payment status
Shipping Service:
shipment status
That is not wrong, but it changes how you debug and reason about the process. Sometimes you need a read model or process tracker that reconstructs the overall state from events.
When lifecycle states become important, what is a state machine? is a useful companion topic.
Testing
Orchestration and choreography require different testing strategies.
For orchestration, test:
- The workflow sequence
- Retry rules
- Compensation rules
- Timeout handling
- Idempotency
- Partial failure paths
- Commands sent to each service
For choreography, test:
- Event schemas
- Event consumers
- Duplicate event handling
- Out-of-order event handling
- Missing event handling
- Dead-letter behavior
- Event version compatibility
Mock servers can help test failure paths before every real dependency exists. See what is a mock server? and how to mock an API before the backend exists.
Performance and Scalability
Choreography often scales well because services react asynchronously and independently. A new consumer can subscribe to an existing event without changing the publisher.
That makes choreography attractive for fan-out:
ProductUpdated
-> Search indexes product
-> Cache invalidates product
-> Analytics records change
-> Recommendation engine refreshes profile
Orchestration can become a bottleneck if one central component coordinates too much high-volume work. But orchestration can also be efficient when the workflow is complex and you need precise control.
The bottleneck risk depends on implementation. Durable workflow engines, queues, partitioning, and horizontal scaling can make orchestrators robust. Event-driven systems can also bottleneck if a topic, consumer group, or database projection cannot keep up.
Hybrid Designs Are Normal
Many real systems combine both.
An orchestrator may coordinate the critical checkout path:
reserve inventory -> capture payment -> create shipment
Then it may publish an event after the core workflow succeeds:
OrderCompleted
Other services can react choreographically:
Email Service sends receipt
Analytics Service records conversion
CRM Service updates customer profile
Recommendation Service updates model
This hybrid approach is often the most practical design:
- Use orchestration for the core business transaction
- Use choreography for independent side effects
AWS Prescriptive Guidance makes a similar distinction in its coordination approach guidance, recommending orchestration across microservice boundaries for distributed transactions and choreography for event-driven reactions that may interest other services.
Decision Guide
Choose orchestration when:
- The workflow has a clear sequence
- One business process owns the outcome
- Human support needs a single status
- Compensation logic matters
- Steps are tightly related
- Failure handling must be centralized
- The process is long-running or auditable
- You need to show progress to users
Choose choreography when:
- Services can react independently
- The work is asynchronous
- Eventual consistency is acceptable
- New consumers may be added later
- The publisher should not know the subscribers
- The event represents a business fact
- Side effects should not block the main workflow
Use both when:
- The core transaction needs control
- Downstream reactions need autonomy
- Some steps are mandatory and others are optional
- The system benefits from events after important milestones
Common Mistakes
Using choreography because it sounds more decoupled. Event-driven systems still have contracts, ownership, and failure modes.
Building a god orchestrator. An orchestrator should coordinate. It should not absorb every service’s business logic.
Letting choreography hide the workflow. If nobody can explain the end-to-end process, the system is too implicit.
Ignoring duplicate events. Event consumers must usually be idempotent because messages can be delivered more than once.
Ignoring out-of-order events. Distributed systems rarely promise perfect ordering across every boundary.
Treating events as private implementation details. Events are contracts once other services consume them.
Choosing only one pattern everywhere. Different flows deserve different coordination styles.
Related Reading
If you are designing microservice coordination, try these topics:
- The orchestrator pattern: a deeper look at centralized workflow coordination
- What is a state machine?: how explicit lifecycle state helps workflows stay understandable
- Distributed tracing: how to follow work across services
- Correlation ID vs trace ID: how to connect logs and traces across event chains
- Contract testing vs integration testing: how to keep service contracts from drifting
- JSON logging best practices: how to make distributed failures searchable
- Cron expressions explained: where simple scheduling stops and workflow coordination begins
For external references, start with microservices.io’s Saga pattern, AWS Prescriptive Guidance on choosing a coordination approach, and Microsoft’s Azure microservices architecture style.
Frequently Asked Questions
What is the difference between orchestration and choreography? Orchestration uses a central coordinator to direct the workflow. Choreography lets services react independently to events without one central controller.
Is choreography always more loosely coupled? It reduces direct service-to-service coupling, but it still creates coupling through event contracts. If consumers depend on an event’s shape and meaning, that event must be versioned and managed like any other interface.
When should I use orchestration? Use orchestration for complex, stateful, multi-step workflows where sequence, compensation, retries, auditability, or support visibility matter.
When should I use choreography? Use choreography for asynchronous reactions to business events, especially when services can act independently and the original operation should not wait for every side effect.
Can a system use both orchestration and choreography? Yes. Many systems orchestrate the critical transaction and then publish events for independent downstream services to react to.
Conclusion
Orchestration and choreography are two ways to coordinate microservices. Orchestration centralizes control in a workflow owner. Choreography distributes control through events and independent service reactions.
Use orchestration when the process needs visibility, ordering, compensation, and a clear owner. Use choreography when services can react independently and eventual consistency is acceptable. Use both when the core workflow needs control but downstream side effects should remain autonomous.
The strongest microservice architectures do not force every interaction into one style. They choose the coordination pattern that matches the business flow, failure model, and operational reality.
Written by the Workshelve team, who write practical explainers on data integrity, networking, and developer tooling.