Part IV · Chapter 7 · When It Breaks · lesson 2
Which link in your chain owns your downtime
13 min
Builds on You promised three nines. That is nine hours a year and Your diagram has four dependencies. You have nineteen
Part IV · Chapter 7 · When It Breaks · lesson 2
13 min
Builds on You promised three nines. That is nine hours a year and Your diagram has four dependencies. You have nineteen
Your status page promises 99.9 per cent. Every dependency on the request path carries a 99.9 per cent SLA of its own, and there are six of them: the managed database, the object store, the identity provider, DNS, the internal session service, and the payment gateway.
Six suppliers, all hitting their number. Nobody is in breach of anything.
Predict
Series availability multiplies, and multiplication of fractions goes the wrong way from intuition.
Six dependencies at 99.9 per cent is 0.999 to the sixth power. Each one contributes its own unavailability to the total, so the unavailabilities add up to roughly six times one component's — and the composite lands below every single figure that went into it.
This is why the first serious reliability conversation in a growing system is never about making a component better. It is about how many components a request has to pass through, because that count sets the ceiling before any individual number is negotiated.
Availability chain
Hypothetical model, not a forecast
Composite availability of a chain of dependencies, each of which may be backed by replicas, and the downtime that composite implies.
It assumes
It ignores
You cannot renegotiate anybody's SLA, so leave the per-dependency availability where it is. Find the change that buys back more than half a percentage point of composite availability — and satisfy yourself that shortening the chain will not get you there.
Every one of them has to be up for the request to succeed.
One means no redundancy at all.
| Dependencies in series | Downtime, minutes per month |
|---|---|
| 0 | 0 |
| 1 | 43.2 |
| 2 | 86.36 |
| 3 | 129 |
| 4 | 173 |
| 5 | 216 |
| 6 | 259 |
Not there yet — keep moving the controls.
Two replicas of each dependency takes the composite from 99.4015 per cent to 99.9994 per cent — from four hours and nineteen minutes a month to under twenty seconds. The second replica is worth more than the fifth by an enormous margin, because the gain is the unavailability raised to the replica count, and the first squaring does nearly all the work.
Which is the only honest way to beat a long chain. You cannot shorten it to one dependency and you cannot talk any supplier into another nine. You can stop any single instance being load-bearing.
The model assumes every dependency carries the same number, which no real system does. Once the figures differ, the question stops being arithmetic and becomes a ranking problem — and the ranking surprises people, because the component that contributes the most downtime is rarely the least reliable one.
The contribution of a dependency is three things multiplied: how often it is unavailable, what share of requests touch it, and whether a request that touches it fails when it is down. That third factor is usually zero or one, and it is the one nobody writes down.
Here is a real-shaped path, ranked by contribution rather than by reliability.
| Dependency | Availability | Share of requests | Fails the request? | Contribution |
|---|---|---|---|---|
| Managed relational database, multi-zone | 99.95% | 100% | yes | 0.050 pp |
| Identity provider | 99.99% | 100% | yes | 0.010 pp |
| DNS and certificate validation | 99.99% | 100% | yes | 0.010 pp |
| Managed object store | 99.9% | 12% | yes, for those | 0.012 pp |
| Payment gateway | 99.99% | 3% | yes, for those | 0.0003 pp |
| Internal recommendation service | 99.0% | 100% | no — renders empty | 0 pp |
The recommendation service is a hundred times less available than the identity provider and contributes nothing. The database is the most reliable thing on the list after the identity provider and DNS, and it owns more of your downtime than everything else combined.
The reason is not a coincidence, and it generalises.
A component known to be unreliable gets a fallback, because somebody got paged about it and built one. A component known to be reliable gets depended on absolutely, because building a fallback for a thing that never fails is impossible to justify in a planning meeting.
So reliability and hardness are inversely correlated by construction. The unreliable things are soft and cost you nothing; the reliable things are hard and own your entire error budget. Ranking dependencies by their own availability reliably produces the wrong list.
Not the same thing
One whose unavailability fails the request. There is no path through the code that produces a useful answer without it.
One whose unavailability degrades the response. The request still completes, with something missing, stale or defaulted.
Both sides accept
Both appear in the dependency list, both have dashboards, and both have owners. Nothing in the chain's diagram distinguishes them — only reading the error path does.
Which is which? Put each one on a side.
A feature-flag service whose SDK streams updates and evaluates against an in-memory cache, with defaults in the binary
The managed relational database behind every authenticated read
An object store holding user-uploaded images, served through a CDN with a long cache lifetime
The identity provider validating the session on every request
A search service, where a failure falls back to a filtered database query that is slower and less relevant
DNS resolution and certificate validation for the API hostname
Check
The number on a provider's page is a commercial commitment with a refund schedule attached, and it is measured the provider's way.
Three things to read before using it as an input. What counts as down — most SLAs measure error rate per five-minute interval across a region, so a degradation that leaves you at a 30 per cent error rate for an hour may credit nothing. What is excluded — scheduled maintenance, anything attributed to your own configuration, and anything the provider classifies as a force-majeure event. And at what granularity — a regional figure says nothing about the zone or the instance you are actually on.
Observed availability is usually better than the SLA during normal quarters and much worse during the bad one, because the SLA is a floor the provider is prepared to pay out against rather than an estimate of behaviour. Use the published figure for arithmetic like this lesson's, and use your own measured dependency error rates for anything you are going to act on.
The product assumes independence, and the whole calculation changes the moment you can name one thing that would take two dependencies down together.
A shared availability zone. A shared control plane, where the API you call to replace an instance is down for the same reason the instance is. A shared deployment pipeline that pushed the same bad configuration to both. A shared DNS zone, or a shared certificate authority. When any of those exists, the composite is better than the product predicts during ordinary months — the failures overlap instead of adding — and far worse in the one month that matters, because a correlated event takes out your replicas at the same instant as the thing they were replicating.
So the test for whether this lesson's arithmetic applies to you is a single question asked of every pair on the list: name a single event that would take both of these down. If you can name one, the multiplication is decoration and the real figure is the frequency of that event.