IN THIS BREAKDOWN · 10 SECTIONS
You can read 24% of this breakdown.
The paper in one minute
In 1994, the distributed objects movement (CORBA and research systems such as Arjuna, Emerald and Clouds) promised that objects would be one kind of thing whether they shared an address space or sat on different machines. You would design the application ignoring location, tune performance later by moving objects around, and finally harden the interfaces that turn out to suffer partial failures. Jim Waldo, Geoff Wyant, Ann Wollrath and Sam Kendall at Sun Microsystems Laboratories argued that "all of these principles are false".
They identify four differences between local and remote calls. Latency differed by four to five orders of magnitude, and they expected the gap to grow; it is the most obvious difference and the least fundamental. Memory access differs because a pointer means nothing in another address space; hiding that requires total control of memory access, and any half-hidden scheme invites bugs. Partial failure is the decisive one: in a local program a failure is either total or detectable by the operating system, but in a distributed system one machine or link can fail while the rest continue, no central agent knows what failed, and a failed link looks exactly like a failed machine. Concurrency follows: remote objects face truly asynchronous invocations with no single manager for synchronization or recovery.
A single model must therefore either ignore partial failure, leaving distributed programs fragile, or impose distributed semantics on every local call, making all programs harder. Neither works.
The authors call the claim that reliability is just a "quality of service" of an implementation a myth, with examples: retrying an enqueue after time-outs creates duplicates that the queue cannot remove because its interface has no request IDs; retrying a name removal until it succeeds can delete another client's binding; NFS, a local file interface run over the network, forced users to choose between soft mounts that return unexpected errors and hard mounts that freeze machines. Their conclusion: decide per object whether it is local or remote, and give remote interfaces the operations needed to cope with partial failure.
Research notes: the problem, approach and results
the 1994 gap between local and remote call latency, four to five orders of magnitude, expected to grow
differences between local and remote calls: latency, memory access, partial failure, concurrency
decades in which the same unification promise returned: messages, procedure calls, objects
Distributed object systems such as CORBA promised that a programmer could call an object without knowing or caring whether it lived in the same address space or on another continent, deferring location, performance and failure to later tuning.
Local and remote calls differ in latency, memory access, partial failure and concurrency. The first two might in principle be masked; the last two cannot, because a remote call can fail partway with no way to know what happened. Robustness therefore has to be designed into interfaces, not bolted on as implementation quality.
Unified local-remote models either ignore partial failure and are fragile, or burden every local call with distributed semantics. NFS, built on a local file interface, shows both outcomes. The authors recommend marking objects as local or remote and giving remote interfaces operations for failure and recovery.
Why it matters to an FDE
An agent's tools look like function calls to the model: a name, arguments, a result. Behind most of them is a network call to another service, with every failure mode this paper describes.
Tool calls fail partially. A timeout does not tell you whether the booking was made. Design every state-changing tool so that the caller can find out (a lookup by request ID) or safely retry (idempotency keys).
Retrying is not robustness. The paper's queue story is the agent that retries "create ticket" after a timeout and files three tickets. The fix belongs in the tool's interface, not in a smarter retry loop.
Latency shapes the design. A model call or remote tool takes milliseconds to seconds, so a chatty agent design that would be fine locally becomes slow and expensive. Decide early which calls can be batched or cached.
Wrappers can hide the difference. Frameworks and protocols that make remote tools look local are convenient; make sure the failure semantics survive the wrapping, so the agent sees "unknown outcome" distinctly from "failed".
Understand the mechanism. Try it on a real problem.
Unlock this breakdown and 99 more papers.
Premium opens every paper in full, plus every answer, concept, course and guide on the site. One payment for six months of access.
6 months · One payment · No auto-renewal
- ◇1 architecture diagram
- </>1 runnable code experiment
- ▦1 results table
- ?5 interview questions with answers
- 03Key takeaways
The vision's three principles, the four differences, the price of unification and the misreadings
Free account - 04How it works
The argument step by step: the four differences, the examples and the proposal
Premium - 05The numbers that matter
The latency gap then and now, and the paper's few quantitative claims
Premium - 06Try it yourself
Measure the local-remote gap on your machine, then simulate the queue and naming failures
Premium - 07Where it breaks
What the paper argues without showing, what changed, and its internal slips
Premium - 08Using it on a deployment
Designing an agent's tools so remote failure is handled, not hidden
Premium - 09Interview angles
Five questions this paper prepares you for, with answer hints
Premium - 10Read next
Where to go from here on this site
Premium
