Why Distributed Systems Fail When Nobody Knows Who Owns the State
Hatched by tfc
May 02, 2026
8 min read
5 views
91%
The Hidden Question Behind Both Architecture and UI
What do a serverless enterprise and a React component tree have in common?
At first glance, almost nothing. One is a sprawling backend world of APIs, events, teams, and cloud primitives. The other is a front end concern about how two components stay in sync. But both are really asking the same question: where does truth live, and who is responsible for it?
That question sounds technical, but it is actually organizational and architectural at the same time. Systems become fragile when state is scattered, duplicated, or owned by too many places at once. Whether the state is a selected tab in a UI or the business logic for an enterprise order flow, the failure mode is familiar: multiple sources of truth, hidden coupling, and a system that looks modular until it starts behaving like a mess.
The surprising insight is that state management is not just a programming pattern. It is a governance pattern. The same logic that tells a React developer to lift shared state to the nearest common parent also tells an enterprise architect to put domain ownership, API boundaries, and event flows in the right place before reaching for serverless at scale.
If you do not know where the truth lives, you will eventually build a system that argues with itself.
When Convenience Becomes Chaos
Serverless is seductive because it removes friction. You can ship quickly, split work into functions, and let the platform absorb operational overhead. React’s component model is equally seductive because it makes UIs feel composable, local, and easy to reason about. In both cases, the first wins are real.
But speed creates a trap. In a UI, duplicating state across sibling components can make the app feel responsive for a while. Then one component updates and the other lags, and users see contradictory behavior. In an enterprise serverless architecture, each team may build its own functions, queues, triggers, and integrations. Soon the organization has many small pieces that are individually elegant but collectively impossible to understand.
This is how a Ball of Serverless Mud forms. It is not simply a technical mess. It is a sign that the system’s state is distributed without a clear ownership model. Every function knows a little too much, every event triggers another hidden dependency, and every team becomes both producer and consumer of rules no one fully owns.
The deeper problem is that distributed systems do not fail because they are distributed. They fail because distribution happens before coherence. Teams optimize for local independence without establishing the common center that makes independence safe.
A React app without lifted state and a serverless enterprise without domain boundaries are variations of the same mistake: copying the convenience of modularity while neglecting the discipline of ownership.
The Real Meaning of Single Source of Truth
The phrase single source of truth is often interpreted too narrowly. In React, it means one component owns a shared piece of state. In enterprises, people sometimes think it means one giant database, one central team, or one monolithic service. That is a misunderstanding.
The real principle is not centralization. It is clarity of ownership.
A single source of truth does not mean everything lives in one place. It means that for any meaningful piece of state, there is exactly one place where updates are authoritative. Everything else is a projection, a cache, a view, or a downstream consequence. This distinction matters because healthy systems are not flat. They are layered. The source of truth sits upstream, while other parts reflect it in different forms.
Think of a restaurant. The kitchen is not the same as the menu board, the waiter’s notebook, or the receipt in your hand. Each is a representation of the order, but only one place should own the order itself. If the menu board, kitchen ticket, and cashier all become independent sources of truth, the customer will get two soups, no salad, or an argument instead of lunch.
That is what happens in software when teams create redundant ownership structures. The same customer record is embedded in a CRM, copied into a billing service, mirrored in a notification system, and reinterpreted by several serverless functions. Each layer claims to be helping. In reality, each layer increases the chances that truth diverges.
Modularity without ownership is not architecture. It is duplication with better branding.
This is why lifting state in React is so powerful. It is not just a UI trick. It is a miniature lesson in system design. The closest common parent becomes the decision point, and children become pure consumers of that decision. The application becomes more predictable not because it has less state, but because the state has a home.
From Component Trees to Enterprise Boundaries
The most useful mental model here is to treat an enterprise like a component tree, but with business consequences.
In React, if two components need to change together, you remove state from both and lift it to their nearest shared parent. That parent is not chosen by aesthetics. It is chosen by dependency. You look for the lowest place in the tree where the shared meaning can be owned without leaking into unrelated branches.
Enterprises need the same discipline, only the parent is not always a service. Sometimes it is a domain, sometimes a team, sometimes an API boundary, sometimes an event contract. The key is to locate the smallest stable unit of ownership that can truthfully govern a piece of business state.
This is where the progression from domain first to serverless first becomes important. If you start with serverless, you may atomize your system into functions before you have defined what belongs together. If you start with the domain, you can ask: which concepts must change together, which data is authoritative, and which team can own this truth without crosscutting dependencies?
Consider an e commerce platform. An order is not just a record. It is a business object with lifecycle, rules, and consequences. If inventory, payments, shipping, and email notifications all maintain separate versions of the order state, each one will eventually drift. But if the order domain owns the authoritative state, the other systems can subscribe to events and react. They are not reinventing truth. They are responding to it.
This is also why API first and event driven first matter as supporting principles. APIs define how truth is requested. Events define how truth is broadcast after it changes. Together they create a controlled relationship between ownership and propagation. The source remains singular, but the system can still scale.
The practical lesson is simple: before you decentralize execution, centralize meaning.
A Better Way to Design Distributed Systems
The deepest connection between these ideas is that both UI architecture and enterprise architecture are really about managing coordination cost.
When state is local and clear, coordination is cheap. A React component updates itself, and the parent decides when to share that state. When a domain owns a business capability, a team can change internal implementation without negotiating every detail with everyone else. But when ownership is fuzzy, every change becomes a cross boundary conversation. The system starts spending more energy reconciling itself than serving users.
This is why many organizations accidentally create distributed monoliths. The code is split, but the responsibility is not. Each service still depends on the same hidden assumptions, so every change requires synchronous coordination. The architecture looks modern, but the social structure behaves like a monolith.
A useful framework is to ask three questions for any shared state:
-
Who owns it? Not who can access it, but who is responsible for updates and correctness.
-
Who observes it? Which components, services, or teams consume the truth after it changes.
-
How does it move? Is the state propagated by props, APIs, events, or manual duplication.
If you cannot answer these cleanly, the system is probably using convenience in place of design.
This framework scales from a checkbox in a UI to an enterprise order pipeline. In React, the answer might be: the parent owns selected filters, children observe them through props, and changes move through callbacks. In an enterprise, the answer might be: the order service owns order state, fulfillment and billing observe it through events, and other systems query it through APIs.
The common pattern is that truth has an owner, but meaning can have many readers.
That difference is what makes a system both coherent and scalable. Readers can multiply. Owners should not.
Key Takeaways
- Treat state ownership as an architectural decision, not just a coding pattern. Every meaningful piece of state should have one authoritative home.
- Do not optimize for decentralization before defining boundaries. Whether in React or serverless, duplication of state is often a symptom of unclear ownership.
- Use the nearest common parent, whether literal or conceptual. In UI, that may be a component. In enterprises, it may be a domain, team, API, or event source.
- Separate truth from representation. APIs, events, caches, and views should reflect state, not compete with it.
- Ask three questions for every shared concern: who owns it, who observes it, and how does it move? If those answers are fuzzy, your design is probably accumulating hidden coupling.
The Architecture of Responsibility
What makes this connection so powerful is that it changes the way we think about scale. We usually assume scale is a matter of breaking things apart. But breaking things apart is only safe when each part knows what it owns and what it merely reflects.
That is why the best architectures are not the ones with the most services or the most components. They are the ones with the clearest responsibility lines. A well structured React tree feels calm because each component has a job. A well structured enterprise feels calm because each domain has a job. In both cases, the system can evolve without constant negotiation because ownership is visible.
So the next time a distributed system begins to look more like a conversation than a machine, do not first ask how to add more functions, more events, or more abstractions. Ask a more fundamental question: where should the truth live so that everyone else can stop pretending to own it?
That question is the bridge between clean UI design and sane enterprise architecture. It is also the difference between a system that scales and a system that merely multiplies its confusion.
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣