A workflow spans several services. What is the practical rule for choosing orchestration or choreography, and what is the design tell?
Show the full answer Hide the answer
The rule
Orchestrate obligations; choreograph notifications.
An obligation is a step someone is responsible for producing — reserve, charge, provision, fulfil. It needs an owner, an acknowledgement, a timeout with a defined action, and a compensation path.
A notification is a statement of fact — "order placed", "user registered", "document published". The publisher does not care who listens; consumers are added without changing it; a consumer failing delays only its own work.
The design tell
If the publisher would want to know that a consumer failed, it is a command wearing a notification's clothes.
That single question resolves most cases, and it exposes the two failures that matter:
A command treated as a notification produces work that silently does not happen. Inventory reservation becomes an implicit side effect of an "order placed" event, with no owner, no acknowledgement, no timeout and no retry policy — so when the consumer is down, orders are accepted, nothing is reserved, and the discrepancy surfaces at fulfilment.
A notification treated as a command couples the publisher's availability to every optional consumer, so a slow analytics pipeline blocks revenue.
What orchestration provides that choreography cannot
An authoritative answer to "where is this and why is it stuck". Without it, diagnosing a stalled workflow means correlating event logs across every participant, timeouts have no owner, and concurrent transitions race with no arbiter.
What orchestration costs
A central component every flow passes through — a new operational dependency, and a change bottleneck if it accumulates business logic. Keep it to sequencing, timeouts and compensation, or it becomes a distributed monolith every team must change and nobody owns.
The hybrid that is usually correct
Both, for different messages in the same flow. An orchestrator drives the obligations — reserve, charge, fulfil — and publishes notifications alongside for analytics, search, recommendations and email.
Treating the choice as global is the mistake; it is a per-message decision, and most non-trivial flows contain both kinds.