The message bus earns its complexity for agents that span processes or machines, for long-running work that resumes after waits, or for per agent type horizontal scaling; in-process state wins for everything else.
Think about how people pass notes in an office. If two coworkers sit next to each other, they hand notes directly. Easy and fast. Now imagine one coworker works in another city, or one is asleep and you need to leave a note for tomorrow. You cannot hand-pass notes anymore. You need a real mailroom that holds the note until the recipient picks it up. The mailroom has overhead (someone to staff it, address labels, tracking), but it is the only way to communicate across distance and across time. In multi-agent systems, in-process state is the hand-pass; the message bus is the mailroom. Use the mailroom when you actually need distance or time; the hand-pass is faster for everyone in the same room finishing in the same hour.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
Concept explanation~2 min read
Everything you need to truly understand this topic: intuition, mechanics, step by step explanation, code, formulas, and worked example. Click to expand.
The message bus versus in process state question is one of the more confusing architectural choices in modern multi-agent design. The bus sounds enterprise-grade and the marketing material around it leans on phrases like actor model and distributed runtime, which makes engineers feel that anything serious must use it. The reality is that most production agent systems in 2026 do fine in-process, and the bus's complexity is justified only by specific workload properties.
This deep dive separates the three capabilities the bus uniquely provides from the workloads that need them, walks the operational costs the bus brings, applies the lifetime test as a clean deployment-grade signal, and closes on how durable checkpoints partially close the gap for one of the three capabilities without requiring a full bus deployment.
What the bus actually provides that in-process state does not
An in-process shared-state pattern (LangGraph typed state, CrewAI task context, a plain Python dict shared across agent invocations) gives you fast, low-overhead inter-agent communication inside one process. Calls are function calls, state reads are dict lookups, and tracing is a flat call stack you can debug with print statements. This is the right default and it is what most production agent features ship on.
The message bus (AutoGen 0.4's actor runtime, Temporal's workflow engine, Service-Bus-backed orchestrators) adds three capabilities that pure in-process state cannot match.
Durability. Messages sit in a queue backed by persistent storage (Redis Streams with persistence, RabbitMQ with disk, Azure Service Bus, AWS SQS). The queue survives process restarts, crashes, and deployments. An agent can write a message, the process can die, the queue retains the message, a new process picks up and continues. In-memory state has no equivalent: when the process dies, the state dies.
Location transparency. The sender of a message does not need to know which process, machine, or runtime the receiver lives in. The bus routes the message to whichever consumer pulls it. This lets agents span runtimes (Python orchestrator plus TypeScript browser-control worker), processes (a Python supervisor talking to a C# enterprise integrator), and machines (compute near data on one box, model inference on another).
Decoupled lifetime. The sender and the receiver do not need to be alive at the same time. An agent can send a message at 10am and the receiver can wake up at 3pm and process it. This is what makes long-running async work possible: the agent can persist its pending work, the process can shut down to save resources, and a new process can resume the work later from the queue.
These three capabilities are the entire reason the bus exists. Any architectural choice to adopt the bus should be justified by a workload property that requires at least one of them.
Situations where this technique stops working.
2–4 min · Everything important, quickly.
Real products, models, and research that use this idea.
- AutoGen 0.4's distributed runtime uses the actor model over gRPC for cross-process agent communication.
- Microsoft AutoGen Studio runs agents as actors with a message bus so workflows can pause for human approval and resume later.
What an interviewer would ask next. Try answering before peeking at the approach.
QHow do durable checkpoints (LangGraph + Postgres, CrewAI long-term memory) blur the line between in-process state and the bus?
Durable checkpoints give you the persistence property without the location-transparency or decoupled-lifetime properties. An in-process workflow with checkpoints can resume after a crash on the same process, but it still cannot span machines or wait for asynchronous external events without a process running. They handle one of the three workload classes (long-running) but not the others, which is enough for some use cases and insufficient for others.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Red flags & common mistakes
The phrases that signal junior thinking. Click to expand.
Reaching for the message bus by default because it sounds enterprise-grade, when in-process shared state is simpler, faster, and sufficient for the vast majority of production agent workloads that fit on one machine.
60 second bullets to scan on the way to the call.
Name the three workload classes that justify a message bus over in-process state
State the lifetime test (does any agent need to outlive its starting process?) and apply it
Primary sources. Browse if you want the original framing.
Same topic, related formats. Practice these next.