Hacktakes · Edition 4
Hacktakes · Edition 4 · July 7, 2026

Metastability, Retries, and the Math of 98%

Evaluating component reliability in isolation is a mathematical illusion, as synchronous dependencies and automated retries guarantee systemic collapse.

By Owen Tate

Sparked by 98% Isn't Much · discussion

I didn't get an immediate response, so we are retrying.
I didn't get an immediate response, so we are retrying.

I feel the need to write this down if only to save myself from re-litigating it in future architecture reviews. The internet seems permanently trapped in a loop where folks are arguing over the exact percentage of acceptable component uptime. I was reading a recent post by Hugo asserting that 98% isn't very much, which naturally spawned a sprawling Hacker News thread debating the context-dependency of reliability metrics. Some folks vehemently defended the 98% heuristic for non-critical workloads, arguing that striving for five nines is an expensive waste of engineering cycles, while others insisted it was a one-way ticket to constant outages. Both sides make intuitive sense in a vacuum, particularly if you view software as a collection of independent islands. Yet the entire debate ignores the brutal physics of distributed systems—specifically the unyielding enemy that is synchronous coordination.

Let’s run the math at a whiteboard. Assume we have a standard, thoroughly modern microservice architecture where a single user request arrives at the API gateway and requires a synchronous fan-out to 40 different backing services to assemble the response. Our component owners have successfully defended the 98% reliability heuristic, meaning each of those 40 individual services successfully returns a payload 98 times out of 100.

To find the aggregate success rate, we simply map the Anti-Scalability Equation: $0.98^N$, where $N$ is the number of synchronous dependencies. For $N = 1$, we get our expected 0.98, and everyone is happy. But for $N = 40$, we calculate $0.98^{40}$ and watch our overall system success rate plummet to roughly 44.5%. This is the mathematical ceiling of your architecture. If you were to run a quick Monte Carlo simulation of this exact request path over ten thousand iterations, you would find that the median user experience is a broken web page.

Oof.

The overall success rate fundamentally degrades into a coin flip weighted toward failure.

Before looking at the catastrophic operational downstream of that math, we have to ask why organizations reliably architect themselves into this corner. The answer lies in the socio-technical reality of engineering incentives. A 98% success rate makes an individual team’s dashboard look perfectly green. The operators are rational actors optimizing for local maxima, keeping their own pagers quiet and their sprint velocities high. They are structurally incentivized to ignore the mathematical reality that their perfectly acceptable component is merely one link in a doomed 40-node chain (which most organizations lack the distributed tracing to fully visualize anyway).

Here is where pristine probability meets the messy reality of the data center. A 44.5% success rate means 55.5% of requests are failing, dropping packets, or timing out. In a purely theoretical system, those failed requests simply vanish into the ether and the math stops there. In production, automated clients immediately retry them.

As the AWS Builders' Library expertly details, automated retries act as selfish load amplifiers. The original 2% failure rate per component is no longer just harmlessly dropping traffic. It actively generates thermal noise that multiplies the load on an already degraded architecture. (I’m assuming the upstream service just had a transient network blip, so I’ll hammer the endpoint again.) The system is now processing the baseline incoming traffic plus the retry storm generated by the 55.5% aggregate failure rate.

Let's model the queue depth under this amplified load. In a healthy, happy-path state, queues drain normally, absorbing minor latency spikes. But when retry loops instantly double the concurrency demands, the load pushes the system past its tipping point into a persistent, bimodal failure state. The HotOS '21 paper on metastable failures proves exactly why this happens—unbounded retry loops lock systems into a permanent overload that they structurally cannot recover from without manual human intervention.

The queue depth effectively hits infinity. The infrastructure is now performing $O(N)$ work just to achieve zero throughput, burning expensive CPU cycles to frantically reject traffic, parse retry headers, and log the subsequent timeout errors into an already congested observability stack.[^1]

Spinning, but stalled.

This bimodal collapse means the 44.5% success rate was actually an optimistic lie. The moment the retry amplifier activates, the system degrades to a total outage. The math translates directly into a pager waking up an exhausted human operator at 3 AM. That operator now has to manually shed load, drop traffic, and disable the retry mechanisms entirely, because the architecture structurally prevents the system from draining its own queues.

Let's consign the debate over isolated uptime percentages to the history books. We cannot evaluate component reliability without graphing its synchronous dependencies and modeling its queueing behavior under duress. Reliability, like simplicity, is a system property: a sea of green dashboards on individually unreliable components is just a mathematical illusion waiting for a retry storm.

[^1]: If you want a fun weekend project, write a TLA+ spec for a naive fan-out retry mechanism and watch the state space explode the moment you introduce a single constrained queue.

← Back to Edition 4