Engineering
Key takeaways
- Scalability and reliability are separate design questions: a system can pass a load test at several times peak traffic and still fail because one dependency stopped answering.
- Vertical scaling deserves to be the first lever, because a larger instance, a corrected index and a cache in front of the heaviest queries buy more runway per engineering hour than a horizontal redesign.
- Autoscaling compute without a plan for the data layer moves the bottleneck into the component with the longest lead time to fix.
- Microservices scale an organisation rather than raw traffic, and splitting before the real bottleneck is understood buys distributed-system complexity with none of the benefit.
- Re-architect when the cost of the next increment of resources exceeds the cost of the change, not when the diagram starts to look dated.
What is a scalable architecture?
A scalable architecture is a system design that absorbs growth in users, data or transaction volume by adding resources, without a fundamental redesign. That is the entire test. If the answer to more load is a larger bill, the design scales. If the answer is a rewrite, it does not, whatever the diagram claims.
Two levers sit under every scaling decision. Horizontal scaling, or scale-out, adds more machines or instances and distributes load across them. Vertical scaling, or scale-up, raises the capacity of a single machine: more CPU, more memory, faster storage. Most architecture debates are arguments about which lever to pull, in which order, and how much runway each one buys.
A third variable is rarely stated and usually decisive: how much engineering time an option costs before it returns anything. A team of nine does not have the same menu as a team of ninety. Sound architecture decisions are priced in engineer-weeks as well as in instance hours.
Is a scalable architecture the same as a reliable one?
No. Scalability asks whether the system can handle more load. Reliability asks whether it survives a component failing. A platform can pass a load test at several times peak traffic and still go dark because one payment provider, one region or one shared connection pool stopped answering. Treating these as a single question is how teams end up with an elegantly horizontal application tier sitting on a single point of failure.
Run them as two separate reviews. The load question is answered with numbers: requests per second, p99 latency, queue depth, connection saturation. The failure question is answered with a list: every dependency, what happens when it is slow rather than down, and who notices first. Most post-incident reviews turn up a failure of the second review, not the first.
By the hour, the figures track company size. More than 90 percent of mid-size and large enterprises lose over $300,000 for every hour of downtime, and 41 percent put their own exposure between $1 million and $5 million or higher.2 At Fortune 500 scale the average runs from $500,000 to $1 million per hour, and finance and healthcare can exceed $5 million.3
Those are the invoices. The durable cost is the retention damage afterwards, which is why architecture options should be scored against customer-facing commitments rather than infrastructure cost per request alone. A design that trims the compute bill and adds an hour to recovery time is not a saving.
Horizontal versus vertical scaling: which lever comes first?
Vertical, in most mid-stage cases. A larger instance, a corrected index and a cache in front of the ten heaviest queries usually buy more runway per engineering hour than a horizontal redesign, and the work fits in a sprint rather than a quarter. Scale-up has a hard ceiling and a single-machine failure mode, both real, but the ceiling normally sits further away than the team assumes.
| Question | Vertical scaling (scale-up) | Horizontal scaling (scale-out) |
|---|---|---|
| What changes | One machine gets larger | More machines share the work |
| Time to value | Hours to days, often a configuration change | Weeks to months, needs statelessness and routing |
| Ceiling | Hard, set by the largest instance available | Soft, set by coordination and data |
| Failure behaviour | One node down means everything down | One node down means reduced capacity |
| Where it fits | Databases and stateful services, early and mid stage | Application tier, queue workers, read paths |
| Cost shape | Steep at the top of the range | Linear, plus a fixed complexity tax |
The pragmatic sequence is measure, optimise, scale up, scale out, and only then split the system. Teams that invert that order pay the complexity tax of distributed systems before proving they need the capacity.
Scale-up is not obsolete. For most platforms it is still the cheapest engineering hour available, and skipping past it is how a six-week problem becomes a two-quarter programme.
Which scalability patterns survive growth?
Six hold up across most platforms, in roughly the order they earn their keep.
- A stateless application tier. Sessions in a shared store, never in process memory. Nothing else on this list works until any request can be served by any instance.
- Caching at three distinct levels. Edge and CDN for static and semi-static responses, an application cache for computed results, and a query cache for expensive reads. Caching is the highest-leverage pattern available because it removes work rather than redistributing it. The discipline it demands is invalidation: every cached item needs an owner, a time to live, and a written rule for what clears it.
- Asynchronous work behind a queue. Anything the user does not wait for (email, exports, thumbnails, webhooks, reconciliation) belongs off the request path. This is also the cheapest resilience win on offer, because a slow downstream service becomes a longer queue instead of a timeout.
- Read replicas before partitioning. Most workloads are read-heavy. Splitting reads across replicas is a smaller change than sharding and reversible if it does not help.
- Orchestrated, autoscaled compute. Containers plus an orchestrator turn horizontal capacity into a policy rather than a project.
- Distributed deployment across zones or providers. Multi-cloud and distributed deployments record 17 percent fewer total outages than single-vendor deployments.5
The orchestration argument has settled. Kubernetes production use reached 82 percent in the 2025 CNCF annual survey, up from 80 percent in 2024 and 66 percent in 2023.6 A year earlier, production plus pilot use already covered 93 percent of the organisations surveyed.7 The open question is no longer whether to use it, but whether a given team should be operating it themselves.
Cost pressure sits behind all of it. Gartner expects worldwide public cloud end-user spending to grow 21.3 percent to $850 billion in 2026, inside total IT spending growth of 10.8 percent to $6.15 trillion, with AI workloads as the main driver.8 Scaling by adding resources works until the resource line becomes the problem, which is why the patterns that remove work outrank the ones that spread it.
Where do growing platforms actually hit their limits?
Almost always in state. Compute scales horizontally with a configuration change. Databases, caches with affinity, file stores and stateful services do not. Autoscaling the application tier without a plan for the data layer relocates the bottleneck into the one component with the longest lead time to fix.
The recurring offenders, in the order they tend to surface:
- A single shared primary database serving every read and write, with connection pools exhausted long before CPU is.
- N+1 query patterns that were invisible on a small table and fatal on a large one.
- Synchronous calls to third parties on the request path, with no timeout, retry budget or circuit breaker.
- Background jobs competing with live user traffic for the same database.
- Session affinity that quietly makes a stateless tier stateful again.
- Missing or wrong indexes, still the most common reason a database looks overloaded when it is not.
Sharding, which splits data horizontally across independent partitions, is the answer once a single primary can no longer hold the write volume or the working set. It is also the least reversible decision here. The shard key determines which queries stay cheap and which become cross-partition scans, and changing it later means a migration under load. Plan it before you need it, and exhaust read replicas, partitioning within one engine, and archiving cold data first.
Does a scalable architecture require microservices?
No. Microservices are one way to scale an organisation and one way to scale workloads that differ from each other. They are not a prerequisite for handling traffic. Splitting too early is a common and costly failure mode: the team inherits network latency, partial failures, distributed transactions and a far harder debugging story, without having solved the original bottleneck, which was usually sitting in the database.
A modular monolith with clean internal boundaries, deployed horizontally behind a load balancer, scales further than most teams expect. The honest trigger for decomposition is asymmetry: two parts of the system have genuinely different scaling profiles, release cadences or failure tolerances, and the coordination cost of one deployable has grown larger than the coordination cost of several. If you cannot name the service you are extracting, the reason, and where its data boundary falls, the split is premature. That call belongs in the design phase of the software development life cycle, not in the middle of an incident.
When should you re-architect instead of adding resources?
Keep adding resources while the cost curve stays flat and the fix is a purchase. Re-architect when adding resources stops working, or when the cost of the next increment exceeds the cost of the change. Five signals that the second condition has arrived:
- Latency rises with data volume rather than with traffic. That is a data model problem, and no instance size fixes it.
- The largest available instance is within one growth cycle of being fully consumed.
- Every incident traces back to the same component, and the mitigation is always the same manual step.
- Deployment risk has become the constraint, so teams batch releases because a single deployable makes small changes expensive to ship.
- Infrastructure spend grows faster than usage, which means you are buying headroom to work around a design rather than capacity to serve customers.
The gap between those two numbers is the work. Preparedness is not a bigger cluster. It is a named owner for every dependency, a rehearsed failover, a load test shaped like real traffic, and a data layer plan written before write volume demands one. None of that requires a rebuild. It requires deciding which of the two questions, load or failure, the platform is weakest on, and putting the next quarter of engineering there.
For an outside read on that, our engineering practice runs the diagnostic across the application tier, the data layer and the deployment path, and the same architecture work sits behind our web platform builds. You can start that conversation here.
Frequently asked questions
What is the difference between horizontal and vertical scaling?
Vertical scaling, or scale-up, increases the capacity of a single machine with more CPU, memory or faster storage. Horizontal scaling, or scale-out, adds more machines and distributes load across them. Scale-up is faster to implement and has a hard ceiling; scale-out has a much higher ceiling and costs statelessness, routing and operational complexity to get there. Most platforms should exhaust scale-up and query optimisation before committing to scale-out.
What role does caching play in scalable system design?
Caching is the highest-leverage scaling pattern because it removes work instead of distributing it, so it improves latency and capacity at the same time. Effective designs cache at three levels: the edge or CDN for static and semi-static responses, the application for computed results, and the query layer for expensive reads. The hard part is invalidation, so every cached item needs an owner, a time to live and an explicit rule for what clears it.
How does database sharding affect scalability?
Sharding splits data horizontally across independent partitions so writes and storage are no longer bound by one primary, which is the only way past a hard write ceiling. The cost is that the shard key fixes which queries stay cheap and which turn into cross-partition scans, and changing it later means migrating live data. It is the least reversible scaling decision, so read replicas, partitioning within a single engine and archiving cold data should be exhausted first.
Is microservices architecture always better for scalability than a monolith?
No. A modular monolith deployed horizontally behind a load balancer handles far more traffic than most teams assume, and premature decomposition adds network latency, partial failures and distributed transactions without addressing the original bottleneck. The legitimate trigger is asymmetry between parts of the system in scaling profile, release cadence or failure tolerance. If the service being extracted and its data boundary cannot be named precisely, the split is premature.
How much does downtime cost a growing platform?
Across industries, the average cost of downtime reached $8,600 per minute in 2025, up from $5,600 in 2022 (Cockroach Labs, State of Resilience 2025). More than 90 percent of mid-size and large enterprises report losing over $300,000 per hour, and Fortune 500 averages run from $500,000 to $1 million per hour (ITIC 2024 to 2025 survey; Gartner, 2024). The larger exposure is usually retention rather than the hourly figure.
How do you know when it is time to re-architect rather than add more resources?
Add resources while the cost curve is flat and the fix is a purchase. Re-architect when latency rises with data volume rather than traffic, when the largest available instance is within one growth cycle of being consumed, when every incident traces to the same component, or when infrastructure spend grows faster than usage. Those signals indicate a design constraint, and no amount of capacity resolves a design constraint.
Sources
- Cockroach Labs: State of Resilience 2025, 2025. cockroachlabs.com
- ITIC: Hourly Cost of Downtime Survey, 2024-2025. outagecost.com
- Gartner: hourly downtime cost for large enterprises, cited by DivergeIT, 2024. divergeit.com
- DataStackHub: Cloud Outage Statistics, 2025-2026. datastackhub.com
- DataStackHub: Cloud Downtime Statistics, drawing on Cockroach Labs research, 2025-2026. datastackhub.com
- CNCF: Annual Cloud Native Survey, Kubernetes production use in 2025, 2026. cncf.io
- CNCF and Linux Foundation: Annual Survey 2024, 2024. cncf.io
- Gartner: worldwide IT spending forecast for 2026, 2026. gartner.com




