Digital Transformation

What Is A Distributed System? What Actually Breaks It

Ha Bui
Reading time: 12 min
What Is A Distributed System? What Actually Breaks It

TLDR (Quick-Answer Box)

A distributed system is a collection of independent nodes that coordinate over a network, so no single failure takes the whole service down. That’s the easy 20 percent; the hard part is knowing exactly which failures your architecture can and can’t absorb.
Real systems combine patterns like client-server, peer-to-peer, and cluster computing, and distribution only earns its added complexity when a single point of failure is something the business genuinely can’t tolerate.
Most failures aren’t clean crashes: nodes go slow or silently disappear, deployments introduce version skew, and the CAP theorem forces every distributed system to trade consistency for availability during a network partition.

Summarize this post by:

A team ships a service that works flawlessly in staging. Weeks later, during a routine deploy, a single node goes quiet. Not crashed, just slow. The rest of the system has no clean way to know whether to route around it or wait it out.

This is the situation a distributed system is built to survive. A distributed system is a collection of independent computers, or nodes, that coordinate over a network so that no single failure takes the whole service down. That is the textbook definition, and it is also the easy 20 percent of the problem.

The hard 80 percent is knowing exactly which failures your architecture can absorb and which ones it cannot.

We’ll cover what a distributed system is, the characteristics and architectures that define one, and then spend real time on the failure conditions that separate teams who can describe these systems from teams who can actually operate them.

What is a distributed system?

Seven independent nodes connected in a network, illustrating how distributed systems coordinate across multiple machines

A distributed system is a collection of independent computers, called nodes, that communicate over a network and coordinate to work as a single system. To an outside user, the collection of machines appears as one unified service.

Nodes do not need to be separate physical machines. They can be containers, virtual machines, or independent processes running on shared hardware. What makes a system “distributed” is not the number of machines involved but the coordination between them toward a shared goal.

Two computers running unrelated software on the same network are not a distributed system. Two computers splitting the same workload and staying in sync about the result.

A large e-commerce platform is a useful example. Search, payments, and inventory can each run on separate servers, and if one of them goes down, the rest of the platform keeps working. The user never sees which server handled their request. That invisibility is the point.

A common misconception about distributed systems

There is a common misconception that a distributed system requires a dedicated server room or specialized infrastructure. In reality, it requires that resources be logically split across a network and coordinated toward one outcome.

A system is distributed the moment it needs more than one machine working together to behave as one, whether that is two servers or two thousand.

The characteristics that define a distributed system

A collection of machines only counts as a distributed system once it exhibits a specific set of traits.

Resource sharing

Nodes pool compute, storage, and data instead of each working in isolation. A request handled by one node can draw on data stored by another without the user knowing the difference.

Concurrency

Multiple nodes process requests at the same time, and there is no global clock keeping every node in lockstep. Two nodes can be doing unrelated work in the same instant, which is efficient, but also the source of most distributed-systems bugs.

Scalability and horizontal scaling

Capacity grows by adding nodes, known as horizontal scaling, rather than by upgrading a single machine. That is why distributed systems handle unpredictable traffic better than centralized ones. Instead of provisioning one machine for peak load, the system adds capacity as demand rises and removes it afterward.

Fault tolerance and availability

When one node fails, other nodes pick up its work through replication, so the overall service keeps running. Fault tolerance is not automatic. It has to be designed in, and a poorly designed distributed system can still go down when a single node fails, just like a centralized one.

Heterogeneity and transparency

Nodes can run different hardware, operating systems, or software versions without breaking the system. The end user never needs to know which node answered their request. Transparency is what makes the system feel unified. When it breaks, a request can get silently rerouted mid-session, and the user notices something is wrong without knowing why.

Centralized vs. distributed systems: where the line actually is

The clearest way to understand why distributed systems exist is to compare them against the alternative:

Dimension Centralized system Distributed system
Scaling Vertical only (bigger hardware) Horizontal (more nodes)
Failure impact Single point of failure Isolated failure, graceful degradation
Consistency Strong, often immediate Frequently eventual, not immediate
Operational complexity Lower Higher
Best fit Small, internal systems with simple requirements High-availability or global-scale systems

Centralization is not a mistake. It is the right choice when architectural simplicity matters more than resilience, which is why plenty of internal business tools and small applications are still built on a single server with a single database.

Distribution adds complexity in one specific case: when a single point of failure is something the business genuinely cannot tolerate. That is the actual decision, not “distributed systems are more modern” or “distributed systems scale better” in the abstract. Every distributed system trades simplicity for resilience, and that trade only pays off when resilience is the thing you need.

Moving a system off a single point of failure rarely means starting over. Our enterprise platform modernization work keeps the legacy system live and serving traffic. At the same time, the distributed replacement takes over piece by piece, so the business never has to choose between stability and progress.

Is a distributed system the same as microservices?

No. Microservices are one architectural style for building a distributed system, where an application is decomposed into independently deployable services. Every microservices architecture is a distributed system. But the reverse is not true, and plenty of distributed systems are built as client-server or multi-tier applications instead.

The distinction matters when you are deciding how to architect something. That said, it deserves its own deep treatment rather than a surface-level pass here. For a full breakdown of where distributed systems and microservices overlap and where they diverge, see our comparison of distributed systems and microservices.

The architectures distributed systems use

Five distributed system architecture types shown in sequence: client-server, multi-tier, cluster, peer-to-peer, and mesh network

Most production distributed systems are combinations of a handful of recurring patterns, not one single model.

  1. Client-server. A central server, or a small group of servers, handles logic and data while clients send requests and receive responses. This is the most common and most straightforward distributed pattern, used everywhere from web applications to internal business tools.
  2. Peer-to-peer (P2P). Every node can act as both client and server, and there is no central authority. Blockchain networks and BitTorrent-style file sharing are the clearest examples. Roles are not fixed; a node providing data in one exchange can request it in the next.
  3. Multi-tier / N-tier. Presentation, application logic, and data layers are separated into distinct tiers. This is standard in e-commerce and banking systems, where the interface, the business rules, and the database each need to scale and change independently.
  4. Cluster computing. Tightly coupled, similarly configured machines in one location act as a single, more powerful system. Kubernetes-orchestrated container clusters are a modern example, turning a group of machines into one schedulable pool of compute.
  5. Grid computing. Loosely coupled, geographically distributed machines, often owned by different organizations, donate spare capacity to a shared computational problem. This pattern shows up in scientific computing more than in typical enterprise software.
  6. Cloud computing. Elastic, provider-managed infrastructure, including virtual machines, containers, and managed services, underlies most modern distributed deployments. Cloud platforms are themselves distributed systems, and most companies today are building distributed systems on top of someone else’s distributed system.

We build and operate cluster and cloud architectures like these for clients through our cloud-native and DevSecOps practice, covering container orchestration, managed cloud platforms, and the CI/CD pipelines that keep deployments safe against version-skew risk.

What actually breaks in a distributed system

In our experience building and running these systems for clients, the gap between them comes down to a specific list of failure modes. They only become obvious once a system is running in production under real load.

Nodes fail slowly, silently, or incorrectly

A node does not usually crash cleanly. More often, it just responds slowly. The rest of the system has to decide whether to wait for it, retry the request elsewhere, or route around it entirely. A replica can also disappear from a cluster with no clean failure signal at all, leaving other nodes to infer the loss rather than being told about it.

A node can respond, too, but incorrectly. That is a different and often harder problem to detect than a node that stays silent, because the system has no obvious reason to distrust the answer it just received.

People can break a system, not just hardware

Some failure modes come from people rather than hardware. A malicious or misbehaving actor joining a cluster has to be detected, not just tolerated. Detection also requires the system to reason about behavior, not just uptime.

Deployments introduce their own risk

Rolling deployments mean some replicas run different code versions at the same time, and the system has to handle mixed-version traffic without corrupting state. Caches and warm-start assumptions can silently make a design impossible to bring up from a cold start, since a system tuned to run on pre-warmed caches may behave very differently the first time it starts from nothing.

Growth changes what breaks

As traffic increases, the actual bottleneck is where finding it requires reasoning about the entire request path rather than the most obvious node.

Moving from a single fault-tolerant cluster to a globally distributed one introduces problems that do not exist at a smaller scale: global server load balancing, cross-cluster data synchronization, and session handling when a user’s locale changes mid-session.

The CAP theorem trade-off

The CAP theorem is the formal name for the trade-off underlying several of these failure modes. During a network partition, a distributed system can guarantee consistency or availability, but not both at once. Since partitions are inevitable at scale, every distributed system has already made this choice, whether or not the team designing it named it explicitly.

Real production examples of these failure modes

In our zero-downtime Azure cloud migration for a US fintech platform, we built a SQL Server primary-secondary setup with automatic failover specifically to handle the “node disappears silently” failure mode. When the primary database is unreachable, the system detects it and fails over to the secondary rather than surfacing the ambiguity to users.

That design choice is how we hit zero downtime during the cutover and 99.99 percent uptime afterward. We also separated consumer, business, and shared application workloads into distinct tiers behind API management, so deploying an update to one layer could not put the stability of another layer at risk. That is a direct, working answer to the version-skew failure mode: isolate the layers so mismatched versions cannot corrupt each other’s state.

Observability is what makes several of these failure modes detectable at all. We build systems that process continuous, real-time event streams through several coordinating services, and every one of them needs a way to trace a problem back to the service that actually caused it, not just the service where it became visible.

Real-world examples of distributed systems

Distributed systems are not a niche architectural choice. They are the default for anything that needs to stay available at scale.

Everyday examples of distributed systems

Streaming platforms rely on multi-region content delivery so that a regional outage does not take down the whole service. Online banking systems coordinate between branches, ATMs, and central servers. So, transactions stay consistent even when individual components go offline. Large e-commerce platforms split order processing, payments, and inventory across independent servers.

Blockchain networks are a peer-to-peer example where every node holds a replica of the ledger and participates in consensus. Content delivery networks cache data geographically close to users to cut latency and absorb traffic spikes.

A higher-stakes example: urban traffic control

Our urban mobility control center processes real-time and historical traffic data across an entire city’s road network through a Kubernetes-orchestrated microservices architecture, hitting sub-200 millisecond latency and 99.9 percent availability. Downtime in a traffic control system has consequences that extend past user frustration and into public safety, which is exactly the kind of pressure that makes distribution worth its added complexity.

An unusual example: volunteer computing

A less common but genuinely interesting example is volunteer computing. Projects like Leela Chess Zero distribute training workloads across thousands of donated consumer machines rather than a company’s own infrastructure, a peer-to-peer pattern distinct from the blockchain and file-sharing examples most explanations default to.

How to know if your system needs to be distributed

Diagram showing a single system branching into a distributed network of connected nodes, surrounded by uptime, latency, and cost monitoring widgets

Distribution is a trade-off, not a default. It should be adopted when specific pressures make a single machine genuinely inadequate, not because it is the more modern-sounding choice.

Signs your system needs to be distributed

A few signals are worth taking seriously:

  • Traffic or data volume that would overwhelm vertical scaling on a single server
  • Availability requirements where downtime is not tolerable, such as financial systems or safety-critical infrastructure
  • Geographic spread, where latency to one origin server is unacceptable for users on the other side of the world
  • Team structure, where independent services genuinely need to be owned, deployed, and scaled separately by different teams

When to stay centralized instead

The counter-signal matters just as much. If strong consistency and architectural simplicity matter more than scale, availability, geography, or team structure, a centralized system is very often the right call, not a compromise. Plenty of internal tools, early-stage products, and low-traffic applications are better served by staying centralized than by taking on distributed-systems complexity they do not yet need.

Final thoughts

A distributed system is easy to define and hard to operate. The definition, the characteristics, and the architecture types are table stakes. The real differentiator, for engineers and for the systems they build, is being able to reason through the specific ways these systems fail.

Before calling a design distributed and fault-tolerant, test it against a specific set of failure modes: silent node loss, version skew during deployment, cold-start assumptions, and cross-cluster synchronization. Redundancy alone does not cover any of them. Each one has to be designed for a purpose.

It’s the same checklist we run against every mission-critical system we build, whether that’s a fintech platform that cannot afford downtime or a traffic control system where downtime has real-world consequences.

Ready to Build Your Next Product?

Start with a 30-min discovery call. We'll map your technical landscape and recommend an engineering approach.

Contact us

Frequently Asked Questions

A distributed system is a group of independent computers that work together over a network, so they act like one system to the people using it. No single computer failure takes the whole system down.

Get Industrial Insights Delivered to Your Inbox

By clicking "Subscribe" you agree to allow Eastgate Software to send newsletter emails to your address. For more information, please read our Privacy Policy.

About The Author

Ha Bui

Ha Bui

CEO & Founder, Eastgate Software

Ha Bui is the CEO and Founder of Eastgate Software. Since 2014, he has led the company's 12+ year engineering partnerships with Siemens Mobility and Yunex Traffic, building a 200+ engineer organization that delivers mission-critical ITS, FinTech, and enterprise software to German engineering standards.

Related Articles