Connectory: organizational memory for your whole company, plus PR reviews that use it. Free to start.

Choreography vs. Orchestration: Multi-Agent Architecture for Enterprise AI

Centralized orchestration or decentralized choreography? A production-tested breakdown of when each pattern wins for reliability, debuggability, and failure recovery.

Nadia Volkov|11 min

Choreography or orchestration for multi-agent AI? Use orchestration when you need auditable, deterministic control flow in regulated workflows, and choreography when loosely coupled agents must scale independently under high throughput. The deciding factor is not happy-path latency but how each pattern handles failure recovery and observability. Most enterprise systems end up with a hybrid: an orchestrated backbone for the critical path and choreographed leaf tasks for parallel work.

I learned this the hard way. Our first production multi-agent system looked elegant in the architecture diagram and behaved fine in staging. Then it deadlocked silently at 2am, and nobody knew until a customer noticed stale data seven hours later.

What follows is a production-tested breakdown of when each pattern wins, where the hidden costs hide, and a decision framework you can apply this week.

The Failure That Killed Our First Multi-Agent Deploy

We shipped a document-processing pipeline built as a choreographed agent chain. An intake agent published an event, an extraction agent reacted, an enrichment agent reacted to that, and a persistence agent closed the loop. Clean, decoupled, elegant. No central coordinator to bottleneck.

At 2:14am, the enrichment agent hit a rate limit on a third-party API, threw an exception, and died. It had already consumed the extraction event but never published its own. The persistence agent was waiting for an event that would never arrive. Nothing crashed loudly. No alarm fired. The system just quietly stopped making progress on one branch while the rest kept humming along, which made the dashboards look healthy.

We found out because a customer's overnight report showed data from the previous day. Debugging took four hours because there was no single place that knew "the workflow for document 88213 is stuck between step 2 and step 3." State lived nowhere and everywhere.

That incident taught me the real question every team faces the moment they move past a single agent: who owns the workflow state, and how do you recover when a step fails? The answer determines whether you pick orchestration, choreography, or a mix. And the honest thesis is this: the choice is about failure recovery and observability, not about which pattern shaves 200ms off the happy path.

Two Architectures, Two Failure Modes

Orchestration means a central coordinator holds the workflow state and explicitly tells each agent what to do next. Think of a conductor. The supervisor calls agent A, gets a result, decides based on that result to call agent B, and keeps the entire process state in one place. Frameworks like LangGraph, AWS Step Functions, and Temporal implement this model.

Choreography means there is no central brain. Agents react to events and emit new events. Each agent knows only its own inputs and outputs. The workflow is an emergent property of the event flow, not a script anyone wrote down. An event-driven mesh on Amazon SNS, EventBridge, or Kafka is the classic implementation.

Here is a concrete pair. A LangGraph supervisor is orchestration: one graph node reads state, routes to a specialist agent, collects the result, and updates shared state before deciding the next hop. An EventBridge agent mesh is choreography: the extraction agent publishes DocumentExtracted, and any agent subscribed to that event pattern wakes up and does its part, publishing its own events downstream.

Both work. They fail differently, and that difference is the whole game.

DimensionOrchestrationChoreography
Control flowCentral coordinator scripts each stepEmergent from event reactions
State ownershipSingle source of truth in the coordinatorDistributed across agents and event log
CouplingCoordinator coupled to all agentsAgents loosely coupled, decoupled deploys
Failure blast radiusCoordinator is a single point of failureFailures isolated but can strand branches
ObservabilityWorkflow state readable in one placeRequires distributed tracing to reconstruct
Scaling modelCoordinator can bottleneckAgents scale independently

Read the bold cells. Orchestration wins on observability and control. Choreography wins on coupling and scale. Neither wins on everything, which is why the decision is a tradeoff, not a verdict.

Where Orchestration Actually Wins

Orchestration is the right default for regulated workflows that need deterministic, auditable step sequences. If you work in finance or healthcare, a regulator does not care that your agents are elegantly decoupled. They care that you can produce an ordered log proving the KYC check ran before the funds moved. A central coordinator gives you that log for free because it owns the sequence.

Human-in-the-loop approvals are trivial with orchestration. When the workflow needs a compliance officer to sign off between step three and step four, the coordinator simply pauses, persists state, and resumes on approval. Implementing that same pause in a pure event mesh means inventing a distributed state machine that recreates orchestration badly.

Here is a supervisor routing to specialist agents with explicit state transitions:

python
from langgraph.graph import StateGraph, END

def supervisor(state):
    if not state.get("kyc_verified"):
        return "kyc_agent"
    if not state.get("risk_scored"):
        return "risk_agent"
    if state["risk_score"] > 0.8:
        return "human_review"   # explicit compliance checkpoint
    return "settlement_agent"

graph = StateGraph(dict)
graph.add_node("kyc_agent", run_kyc)
graph.add_node("risk_agent", run_risk)
graph.add_node("human_review", queue_for_officer)
graph.add_node("settlement_agent", run_settlement)

graph.set_entry_point("supervisor")
graph.add_conditional_edges("supervisor", supervisor)
graph.add_edge("settlement_agent", END)

Every transition is explicit and inspectable. When an auditor asks "what happened to transaction 4471," you query one state object. When a step fails, the coordinator knows exactly where you are and can retry that step or compensate. This is why teams in regulated domains lean orchestrated. The observability advantage compounds during incidents, which is where cost concentrates.

70%
Of software teams report distributed system debugging as their top operational pain point [1]
4x
Longer mean-time-to-resolution for incidents without centralized workflow state, in our production experience
50%
Of organizations building agentic systems cite reliability and observability as the primary blocker to production [2]

Where Choreography Earns Its Complexity

Choreography earns its keep in high-throughput, loosely coupled work where agents must scale independently. If your extraction agents need 40 instances during a batch spike while enrichment needs only 3, an event mesh lets each scale on its own consumer lag. A central coordinator would either bottleneck or force you to over-provision the whole graph.

The trick that makes choreography survivable is disciplined event contracts and idempotency. Every event carries a schema version and a correlation ID, and every consumer must handle the same event twice without corrupting state. Skip idempotency and a retry storm will double-charge a customer.

python
def handle_document_extracted(event):
    doc_id = event["correlation_id"]
    # idempotency guard: skip if already enriched
    if store.exists(f"enriched:{doc_id}"):
        return
    result = enrich(event["payload"])
    store.put(f"enriched:{doc_id}", result)
    publish("DocumentEnriched", {
        "correlation_id": doc_id,
        "schema_version": 2,
        "payload": result,
    })

Here is the hidden cost nobody budgets for: distributed tracing stops being optional. In an orchestrated system you can debug by reading the coordinator's state. In a choreographed mesh, the only way to answer "why did document 88213 stall" is to reconstruct the event timeline across services with correlation IDs, OpenTelemetry spans, and a trace backend. If you deploy choreography without that, you are back to my 2am incident.

The Silent Failure Trap
In choreography, a consumer that dies after reading an event but before publishing its output creates a stranded branch that fires no alarm. Health checks stay green because every service is technically running. Always pair event consumers with dead-letter queues and a per-correlation-ID completeness check that flags workflows stuck past an expected duration. Eventual consistency is fine. Eventual silence is not. ## The Hybrid Pattern Most Teams Actually Need Most enterprise systems land on a hybrid: an orchestrated backbone for the critical path and choreographed leaf nodes for parallel, independent work. This is not a compromise, it is a recognition that different parts of a workflow have different requirements. The architecture looks like this. A supervisor owns the top-level state and the compliance-sensitive sequence. When it reaches a fan-out step, say "enrich this document against six data sources," it emits events and lets six independent agents work in parallel via the event mesh. Those agents publish results, an aggregator collects them, and control returns to the supervisor once the fan-out completes. The critical path stays auditable. The embarrassingly parallel work stays independently scalable. What keeps the hybrid from decaying into chaos is contracts. Every agent publishes an agent manifest: what events it consumes, what it emits, its idempotency guarantees, and its expected latency SLA. The supervisor treats each fan-out region as a black box with a defined completeness signal. When a leaf agent changes its output schema, the manifest and API contract catch the break before deploy, not at 2am. The observability requirement is non-negotiable for the hybrid. You need trace context propagated from the orchestrated layer into the choreographed layer so a single correlation ID spans both. This is where an engineering intelligence dashboard that unifies traces and per-agent failure attribution earns its cost, because the hardest bugs live at the seam between orchestrated and choreographed regions. Teams building agentic systems should treat observability instrumentation as a first-class deliverable, the same way we treat automated AI code review with SlopBuster as part of shipping, not an afterthought. ## A Decision Framework You Can Apply This Week Score each workflow across four axes. If a workflow scores high on audit needs and coupling intolerance, orchestrate it. If it scores high on throughput and coupling tolerance, choreograph it. Mixed scores mean hybrid. | Workflow | Audit needs | Throughput | Coupling tolerance | Recommendation | |----------|-------------|------------|--------------------|----------------| | Payment settlement | High | Low | Low | Orchestrate | | Bulk document enrichment | Low | High | High | Choreograph | | Loan origination with approvals | High | Medium | Low | Orchestrate | | Content moderation at scale | Medium | High | High | Choreograph | | Order fulfillment with fan-out | High | High | Mixed | Hybrid | | Customer support triage | Medium | Medium | Medium | Hybrid, start orchestrated | Two rules of thumb have held up across every system I have shipped. First, start orchestrated. Orchestration is easier to reason about, easier to audit, and easier to debug. Extract pieces to choreography only when you have proven scale pressure, meaning the coordinator is measurably bottlenecking, not because a diagram looked cleaner. Premature choreography is how teams inherit distributed-systems problems before they have distributed-systems throughput. Second, whichever pattern you choose, build the failure-recovery machinery before you go to production. Run this checklist: - Retries with backoff on every agent call, bounded so you do not retry-storm a rate-limited API - Dead-letter queues on every event consumer so poisoned messages surface instead of vanishing - Saga compensation for any multi-step workflow that mutates state, so a late-stage failure can roll back earlier steps - Circuit breakers around third-party dependencies so one slow API does not stall the whole graph - Completeness checks per correlation ID that alarm when a workflow stalls past its expected duration That last item is the one most teams skip, and it is the exact control that would have caught my 2am deadlock. ## Instrument Before You Scale Here is a concrete action you can take in the next 30 minutes: pick your most important agent workflow and map its state ownership on a whiteboard. For each step, write down who holds the state, what event or call triggers the next step, and what happens if that step dies mid-execution. If you cannot answer "where would this stall" for every step, you have found your next incident before it finds you. The metric to start tracking this week is per-agent failure attribution rate: for every failed workflow, can you name the exact agent that failed and the exact step it failed at, within minutes? Teams that hit 90%-plus attribution recover from incidents in a fraction of the time of teams stuck reconstructing timelines by hand [1]. If your rate is low, that is a signal your observability, not your architecture, is the real bottleneck. Back to that 2am deadlock. The system was not badly designed. It was badly instrumented. A completeness check per correlation ID and a dead-letter queue on the enrichment consumer would have paged us at 2:16am instead of letting a customer discover it at 9am. The architecture pattern mattered less than the recovery machinery around it. ### Frequently Asked Questions Is orchestration or choreography better for AI agents? Neither is universally better. Orchestration wins for auditable, regulated, human-in-the-loop workflows. Choreography wins for high-throughput, loosely coupled tasks that scale independently. Most production systems use a hybrid. When should I switch from orchestration to choreography? Only under proven scale pressure, when your central coordinator is measurably bottlenecking throughput. Start orchestrated because it is easier to debug and audit, then extract parallel leaf tasks to an event mesh when metrics justify it. What is the biggest hidden cost of choreography? Distributed tracing becomes mandatory. Without correlation IDs, dead-letter queues, and completeness checks, agents can fail silently and strand workflows with no alarm firing. Does a hybrid pattern add too much complexity? Only if you skip contracts. Agent manifests and versioned event schemas keep the orchestrated backbone and choreographed leaves from drifting apart. ### Next Steps 1. Map state ownership for your top workflow this week using the 30-minute exercise above. 2. Score your workflows against the four-axis framework table and label each orchestrate, choreograph, or hybrid. 3. Audit your failure-recovery checklist and fill any gaps in retries, dead-letter queues, saga compensation, circuit breakers, and completeness checks. 4. Instrument per-agent failure attribution before adding any new agents to the system. Pick the pattern for the failure mode you can afford, not the happy path that demos well. ## References [1] Grafana Labs, "Observability Survey 2024," 2024. https://grafana.com/observability-survey-2024/ [2] LangChain, "State of AI Agents Report," 2024. https://www.langchain.com/stateofaiagents [3] AWS, "Choreography vs Orchestration in Event-Driven Architectures," AWS Prescriptive Guidance, 2024. https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-integrating-microservices/orchestration.html [4] DORA, "Accelerate State of DevOps Report 2024," 2024. https://dora.dev/research/2024/ [5] Martin Fowler, "What do you mean by Event-Driven?," martinfowler.com, 2017 (still the most cited reference on choreography tradeoffs). https://martinfowler.com/articles/201701-event-driven.html [6] LangChain, "LangGraph Documentation: Multi-Agent Workflows," 2024. https://langchain-ai.github.io/langgraph/