Skip to content
About
Main content

Summary and key takeaways

The seven articles, one sentence each:

  1. Feedback loops. A response to stress that adds load (retries, stampedes, , least-loaded routing) is a loop with gain, delay and sign. When the branching factor R is above 1, load grows from any starting point (4 tiers with 4 attempts each can multiply load 4^4 = 256 times).
  2. Metastable failure. In the band C/k < λ < C the system has two stable states, and the outage outlives its trigger. Fix k (the degraded-mode amplification), not the trigger. Recovery needs λ < C/k, so shed hard and readmit progressively.
  3. Cascading and correlated failure. Hidden dependencies, resource exhaustion, timeout ordering and break independence. is capped by the least available shared component. Buy independence with cells, , and recovery paths that do not use what failed.
  4. Partial and gray failure. is an assumption that must be purchased. A slow node is worse than a dead one. Health is observed from inside the boundary it certifies, hides failures, and only external observers and data validation see delivered service.
  5. Death spirals. Systems defer work (, , warm-up, catch-up) and the cost of paying rises with the debt. Autoscaling is a cost tool, restart is not a reset, and recovery is the peak load event.
  6. Overload defences. You cannot defend against overload by doing more work. Shed early and cheaply, propagate , budget retries, break circuits with probing and , carry deadlines, hedge only , and degrade before refusing. Every defence is a loop too.
  7. Synthesis. Six questions find these failures in design reviews.

The principles of this mechanism:

PrincipleOne line
Concurrency = × Latency feeds in-flight work, which feeds latency (the GC loop, shedding triggers)
Costs are conservedA cache, a buffer or a broker moves cost into a rare event, it does not remove it
Variance matters more than volumeSynchronized peaks, one slow member or one big item do the damage while the mean looks fine
A fixed rate meets exponential growth and losesThe decrease in must be multiplicative
Independence is assumed everywhere and true almost nowhereIt must be purchased with idle capacity, diversity, partitioning or staged rollout
Randomization can replace coordinationJitter, two choices, shuffle sharding,
The regime-flip principleAn optimization flips sign at its regime boundary (retries, , , hedging)
The discard principleWork is always discarded by someone; choose who, early and cheaply
The hidden-state principleState-dependent cost means memory, two thresholds and no clean restart
The global-invariant principleDeadlines, budgets and priority must travel in the request
Sharing, standardizing and automating raise correlation
Masking moves failure to a channel without a schemaEvery masking mechanism needs a counter
Self-reports measure the component, not the serviceOnly external observers see delivered service
accrues interestEvery deferral needs a hard stop
Recovery is the peak load eventCompute recovery load and make part of the droppable

The six-question diagnostic: where is the loop (gain, delay)? What is k? What is shared? Who observes health, and from where? What work is deferred and does its cost rise? What does recovery cost, and is it provisioned?

The defence table in one line each: shedding and concurrency limits bound the store (ms), backpressure moves the store upstream, and breakers cut the gain (s), jitter breaks correlation, deadlines remove wasted work, hedging buys the tail for about 5% load, lowers cost per request, autoscaling is minutes and so not a defence.

The story in one paragraph. At Wayhop a 3-second pricing stall became a 40-minute outage ( loop), outlived its cause (metastability), spread through an optional call and a shared config push (cascade), hid behind a green health check (), degraded itself through GC, compaction, flapping and replay (death spirals), and was finally contained by a short list of defences that each cost some work. Selin's checklist now stops the next one in the design review.