Definition · Series availabilityComponents are in series for a request when the request needs all of them. If they fail independently, the availability of the whole is the product of the parts: A = ∏ᵢ Aᵢ. The unavailability is 1 − ∏ᵢ Aᵢ, which for small unavailabilities is close to Σᵢ (1 − Aᵢ) — the outages add up.
The approximation is worth carrying separately from the formula, because it is how the number is estimated in a meeting. Ten dependencies each down one part in a thousand are down roughly ten parts in a thousand altogether, so the chain is about 99%. The exact answer is 99.00449%, and the estimate was reached without a calculator.
ten links, each 999/1000
A = (999/1000)¹⁰
= 990 044 880 209 748 209 880 044 990 001 / 10³⁰
= 0.9900449 = 99.00449% two nines, not three
downtime a month = (1 − A) × 2 628 000 s = 7 h 16 min 2.05 s
the weakest link alone = 43 min 48 s
ratio = 9.96 ×
The product is exact. Ten fractions of 999/1000 multiply to 999¹⁰ over 1000¹⁰, a thirty-digit rational, and the lab carries it as one rather than as a double that has already lost the digits the lesson is about. The percentage appears once, at the end.
Adding a better service still makes it worse
This is the consequence people resist. A chain at 99.00449% gains a new dependency at 99.99% — a service ten times better than any link already in it. The chain becomes 98.99459%, which is one nine. Multiplying by 0.9999 is still multiplying by something less than one, and there is no availability, short of exactly 1, that a chain can absorb for free.
Example · Eleven links, ten of them the same(999/1000)¹⁰ × (9999/10000) = 98.99459%, 7 h 20 min 22.24 s a month against the 7 h 16 min 2.05 s before it, and the nines count drops from two to one. Type the eleventh dependency into the lab's chain and watch the running product step down rather than hold still. Every architecture review that adds “just one more service, and it's a very reliable one” is this calculation.
Which way to read the number
Two readings of the same fact are useful in different rooms. The first: a chain is a budget and each dependency spends part of it, so a three-nines promise cannot be built from three-nines parts. The second: the cheapest way to raise a chain is usually to shorten it, because removing a link multiplies the product by more than any plausible improvement to a link that stays.
Example · What three nines costs in a chain of tenFor the whole chain to reach 999/1000, ten equal links must each satisfy A¹⁰ = 0.999, which is A ≈ 0.9998999 — about four nines each. Set the lab's chain to ten entries of 99.99 and the product is 99.90004%: ten four-nines services, assembled in series, are worth three nines. That is the arithmetic behind every complaint that the platform team's SLOs are stricter than the product's.
One caution before the lab. Everything above assumes each dependency is genuinely required. A service called on a cache miss, or only for one endpoint, is not in series with every request and does not belong in the product at its full weight; putting it there produces a pessimistic number that the next argument will rightly dismiss.