← Back to list

Multi-Agent Systems Are Just Microservices — With All the Same Failure Modes

Distributed coordination, cascading failures, version mismatches, retry storms, and observability gaps. Everything old is new again.

Rohit Anand in Signal & Structure · 2026-05-29 13:29 · 0 claps · 8.3 min read
#software-engineering #ai-architecture #multi-agent-systems #distributed-systems #microservice-architecture
Open on Medium ↗
Wiki topics: AGT · AI Agents 🏛️ · Architecture

Multi-Agent Systems Are Just Microservices — With All the Same Failure Modes

Distributed coordination, cascading failures, version mismatches, retry storms, and observability gaps. Everything old is new again.

The Architecture Nobody Recognizes

Draw the architecture diagram of a modern multi-agent system. An orchestrator agent receives a task and decomposes it into subtasks. It delegates retrieval to a research agent, analysis to a reasoning agent, and execution to a tool-calling agent. The tool-calling agent invokes external services through MCP servers. The reasoning agent queries a memory store. The research agent hits a vector database. Results flow back through the chain, are assembled by the orchestrator, and delivered to the user.

Now draw the architecture diagram of a microservices application circa 2018. An API gateway receives a request and routes it to an orchestration service. The orchestration service calls an authentication service, a business logic service, and a notification service. The business logic service queries a database. The notification service calls an external email API. Results flow back through the chain, are assembled by the orchestrator, and delivered to the client.

The topologies are identical. The communication patterns are identical. The failure modes are identical. The industry has spent seven years learning how to operate distributed microservices systems — circuit breakers, service meshes, distributed tracing, saga patterns, bulkheads, chaos engineering — and is now building multi-agent systems that exhibit every failure mode microservices exhibited, while largely ignoring every lesson microservices taught.

This is not a loose analogy. It is a structural equivalence, and pretending otherwise is how organizations end up debugging the same distributed systems problems they solved half a decade ago — except this time, the services are nondeterministic.

The Five Failure Modes That Transfer Directly

1. Cascading Failures

In microservices, a cascading failure occurs when one service’s failure propagates to its dependents. The payment service goes down, which causes the order service to timeout, which causes the API gateway to queue requests, which causes the load balancer to drop connections. A single point of failure cascades into a system-wide outage.

In multi-agent systems, the mechanism is identical but harder to detect. A tool-calling agent fails to invoke an MCP server — perhaps the server is down, perhaps authentication expired, perhaps the response is malformed. The tool-calling agent retries, times out, and returns an error to the executor agent. The executor, lacking the tool output, produces an incomplete result. The orchestrator, receiving an incomplete result, either halts the entire workflow or — worse — proceeds with partial information and produces an output that looks complete but is missing a critical component.

The cascading failure in a multi-agent system is more insidious than in microservices because the agents are designed to be resilient. An LLM-based agent that receives an error does not necessarily propagate the error — it may attempt to work around it, generating a plausible but incorrect result. The failure does not cascade as a crash. It cascades as degraded quality, which is harder to detect and harder to attribute to the root cause.

2. Retry Storms

In microservices, a retry storm occurs when a failing service trigger retries from all its callers, which themselves trigger retries from their callers, creating an exponential amplification of load that turns a partial failure into a complete one. The solution — exponential backoff with jitter, circuit breakers, retry budgets — took years to become standard practice.

Multi-agent systems are acutely vulnerable to retry storms because LLM API calls are expensive and slow. When a model endpoint becomes slow or returns errors, every agent in the system that depends on it begins retrying. Each retry consumes tokens, incurs latency, and adds load to the already struggling endpoint. An orchestrator that retries a failed subtask by re-invoking the entire agent chain can amplify a single endpoint failure into hundreds of redundant API calls.

Most agent frameworks today have no concept of retry budgets. They retry until they succeed or exhaust a fixed count, without coordination between agents. Two agents retrying the same failing tool simultaneously do not know about each other’s retries. The absence of circuit breakers — which would stop retrying after a threshold of failures and fall back to a degraded mode — means that multi-agent systems under stress behave exactly like microservices did in 2015: they amplify failures instead of containing them.

3. Version Mismatches

In microservices, version mismatches are a perennial source of production incidents. Service A is deployed at version 2.3, which expects a response format that Service B stopped producing at version 2.1. The contract between them was implicit, and the mismatch was not caught because the services were deployed independently without integration testing.

In multi-agent systems, version mismatches occur at multiple levels. The orchestrator may expect a tool-calling agent to return structured JSON, but the tool-calling agent was updated to return a different schema. An MCP server may update its tool manifest, adding new required parameters that the agent does not know to provide. A model upgrade may change an agent’s output format in subtle ways — slightly different JSON keys, different levels of verbosity, different handling of edge cases — that break downstream agents that parse the output.

The version mismatch problem is compounded by nondeterminism. In microservices, the same input to the same version of a service produces the same output. In multi-agent systems, the same input to the same model can produce different outputs on different invocations. This means that a version mismatch might manifest intermittently — working 90% of the time and failing unpredictably — making it far harder to reproduce and debug.

4. Observability Gaps

In the early days of microservices, observability was primitive. Teams had logs from individual services but no way to trace a request across the system. Distributed tracing tools like Jaeger, Zipkin, and later OpenTelemetry emerged to fill this gap, providing end-to-end visibility into request flows across service boundaries.

Multi-agent systems are in the same pre-tracing era. Each agent produces logs — model inputs, outputs, tool calls — but there is no standard mechanism for correlating these logs across agents into a coherent trace of the entire workflow. When a multi-agent system produces a bad output, the debugging process involves manually examining each agent’s logs, reconstructing the sequence of calls, and identifying where the chain went wrong.

The observability gap is worse in agent systems than it was in microservices because the payload at each step is natural language, not structured data. In microservices, a trace shows a JSON request and a JSON response at each hop — structured, parseable, diffable. In agent systems, a trace shows a prompt and a completion at each hop — unstructured text that must be read and interpreted by a human to assess whether the agent behaved correctly. Automated anomaly detection on natural language traces is an unsolved problem.

5. Partial Failures and Inconsistent State

In microservices, partial failures create inconsistent state. An order is created but the payment fails. A user is updated in one service but the cache in another service still holds the old version. The saga pattern and eventual consistency models were developed to handle these scenarios — compensating transactions, idempotency keys, and reconciliation processes that detect and resolve inconsistencies.

Multi-agent systems face the same problem with less tooling. An orchestrator delegates three subtasks to three agents. Two succeed and one fails. The orchestrator must decide: retry the failed subtask? Proceed with partial results? Roll back the completed subtasks? If the completed subtasks had side effects — sending an email, updating a database, creating a file — rolling back may not be possible.

The absence of transactional semantics in agent-to-agent communication means that every multi-step agent workflow is operating in the equivalent of a distributed system without transactions. The same inconsistency problems that plagued early microservices — and that motivated years of work on distributed transaction patterns — are manifesting again in multi-agent systems, with no equivalent patterns in place.

What Microservices Taught Us That Agents Must Learn

The microservices era produced a rich toolkit for operating distributed systems reliably. Multi-agent systems should adopt these patterns, adapted for the specific characteristics of LLM-based agents.

Circuit breakers. When a downstream agent or tool fails repeatedly, stop calling it. Fall back to a degraded mode — a cached response, a simpler alternative, or an explicit “I cannot complete this part of the task” message. Resume calling only after a cooling period. This prevents retry storms and contains cascading failures.

Distributed tracing. Implement trace IDs that propagate through the entire agent chain. Every agent call, tool invocation, and model request should carry a trace ID that links it to the originating task. Build tooling that can reconstruct the full trace — every prompt, every completion, every tool call, every decision point — from these IDs.

Contract testing. Define explicit contracts between agents — the expected input format, the expected output format, and the expected behavior. Test these contracts in CI before deploying agent updates. When Agent A is updated, verify that its output still satisfies the contract expected by Agent B before the update reaches production.

Bulkheads. Isolate agent failures so they cannot propagate. If the research agent fails, the orchestrator should be able to continue with the execution agent’s results, clearly noting the gap. Bulkheads in agent systems mean designing workflows where each agent’s output is valuable independently, not just as input to the next agent.

Health checks and readiness probes. Before delegating a task to an agent, verify that the agent is operational. Check that its model endpoint is responding, its tools are accessible, and its memory store is reachable. Do not discover that an agent is unhealthy after investing tokens and latency in a complex workflow.

Idempotency. Design agent actions to be safely retryable. If an agent sends an email as a side effect, ensure that retrying the agent does not send the email twice. This requires the same idempotency patterns that microservices use — idempotency keys, deduplication checks, and side-effect tracking.

Chaos engineering. Deliberately inject failures into the agent system — failed tool calls, slow model responses, corrupted memory retrievals — and observe how the system behaves. The goal is to discover cascading failure modes and observability gaps before they manifest in production.

What Is Different This Time

The microservices playbook applies, but multi-agent systems have properties that microservices did not, and these properties require extensions beyond the standard toolkit.

Nondeterminism is inherent. Microservices are deterministic: the same input produces the same output. Agent systems are stochastic: the same input may produce different outputs. This means that failures may not be reproducible, tests must account for output variance, and monitoring must track distributions rather than exact values.

The payload is opaque. Microservices communicate through structured data — JSON, protobuf, gRPC. Agents communicate through natural language. Validating that an agent’s output is correct requires semantic understanding, not schema matching. Contract testing for agents is fundamentally harder than contract testing for APIs.

Cost scales with failure. In microservices, a retry costs CPU cycles. In agent systems, a retry costs model tokens — which cost money. A retry storm in a multi-agent system is not just a reliability problem; it is a cost problem. An uncontrolled retry loop can generate thousands of dollars in API charges before anyone notices.

Autonomy creates unpredictable paths. A microservice follows a predetermined code path. An agent decides its own path based on the task and context. This means that the same agent, given similar but not identical inputs, may invoke different tools, call different downstream agents, and produce workflows that have never been seen before. Testing must cover not just known paths but the agent’s decision-making process that generates novel paths.

The Bottom Line

The multi-agent system you are building right now is a distributed system. It has all the properties of a distributed system — network boundaries, independent failure domains, communication overhead, consistency challenges, and observability requirements. It will exhibit all the failure modes of a distributed system — cascading failures, retry storms, version mismatches, partial failures, and state inconsistencies.

The microservices era spent a decade learning how to operate distributed systems reliably. The patterns are documented. The tools are available. The lessons are public. The question is whether the agent-building community will learn from them or repeat every mistake from scratch.

The topology is the same. The failures are the same. The solutions should be too — adapted for nondeterminism, natural language payloads, and token economics, but rooted in the same engineering discipline that turned microservices from a deployment nightmare into a manageable architecture.

Everything old is new again. The only question is whether we admit it before the first major outage or after.


메타데이터
post_id
0f4dc8df2232
slug
multi-agent-systems-are-just-microservices-with-all-the-same-failure-modes-0f4dc8df2232
url
https://medium.com/signal-structure/multi-agent-systems-are-just-microservices-with-all-the-same-failure-modes-0f4dc8df2232
canonical_url
https://medium.com/signal-structure/multi-agent-systems-are-just-microservices-with-all-the-same-failure-modes-0f4dc8df2232
author_url
https://medium.com/@dnanatihor
status
ok
fetched_at
2026-06-13 12:55:53