Every source behind this page, graded, with what it shows and the one thing
to carry out of it. Filter by kind. The full ledger, with the quote supporting each
individual claim, ships beside this file as sources.md.
Paper
Rockset, Penn State, UNH2021-05
Metastable Failures in Distributed Systems (HotOS '21)
The paper that named the pattern, written by engineers with a decade of Meta production
behind them. Four worked case studies: request retries, look-aside cache, slow error
handling, and link imbalance. Introduces hidden capacity, characteristic metrics and
trigger intensity as operational concepts.
Carry forwardThe root cause is the sustaining loop, not the trigger, because many triggers reach the same state.
sigops.org/s/conferences/hotos/2021/papers/hotos21-s11-bronson.pdf
Paper
Penn State, UNH, Twitter2022-07
Metastable Failures in the Wild (OSDI '22)
Twenty-two incidents from eleven organisations, classified from public postmortems, with
a table giving trigger, sustaining effect and mitigation for each. Section 6.3, "Fix to
Break", is the most useful two paragraphs in the entire literature for anyone who runs
post-incident reviews.
Carry forwardRetries sustain more than half of these failures, and load shedding mitigates more than half.
usenix.org/system/files/osdi22-huang-lexiang.pdf
Postmortem
AWS2015-09
Summary of the Amazon DynamoDB Service Disruption
The canonical example. A brief network disruption, membership payloads that had grown
past the retrieval allowance because of global secondary index adoption, and retries that
held the metadata service down. Recovery required pausing traffic because adding capacity
needed the saturated service to answer.
Carry forwardA control plane whose administrative API shares a fate with its data path cannot be repaired under load.
aws.amazon.com/message/5467D2/
Postmortem
AWS2025-10
AWS Service Event in Northern Virginia, 19 to 20 October 2025
Notable because AWS uses the term "congestive collapse" in its own prose, and because
the collapse began after the triggering DNS defect was already fixed. EC2 launches
remained impaired for roughly eleven hours past that point while DWFM re-established
droplet leases it could not complete before timeout.
Carry forwardRate-limit recovery work by queue depth. AWS committed to exactly that as a corrective action.
aws.amazon.com/message/101925/
Postmortem
AWS2021-12
AWS Service Event in Northern Virginia, 7 December 2021
An automated scaling activity produced a connection surge across the boundary between
two internal networks. Retries turned congestion into persistent congestion, and a latent
defect stopped the tested backoff behaviour from engaging. Monitoring data crossed the
same congested path, so the operators were blind while diagnosing.
Carry forwardKeep the telemetry that diagnoses congestion off the path that congests.
aws.amazon.com/message/12721/
Postmortem
AWS2020-11
Summary of the Amazon Kinesis Event in Northern Virginia
A small capacity addition pushed every front-end server past an operating system thread
limit, leaving them with unusable shard-maps. The valuable content is the recovery
arithmetic: a few hundred servers per hour, and up to an hour for fleet membership to
propagate.
Carry forwardYour fleet's cold-start time is the floor on every outage in that system. Measure it once, deliberately.
aws.amazon.com/message/11201/
Postmortem
GitHub2026-08
Incident summary for 17 August 2026
The official status thread carries the technical detail the blog post omits: the Istio
sidecar concurrency limit, the four HAProxy nodes exhausting flow limits, the VS Code
retry bug, the RPS figures, and the fact that pausing HAProxy on those nodes produced
immediate broad recovery.
Carry forwardThe status thread is often a better engineering document than the blog post. Read both.
github.com/orgs/community/discussions/205164
Postmortem
GitHub2026-08-20
The August 17 outage, and the work ahead
GitHub's Chief Technology Officer writing three days after a seven-hour outage. Short,
and useful mainly for the remediation list, which is a commitment to build the layer this
guide argues most stacks are missing.
Carry forwardThe 2026 fix is the 2016 prescription: retry limits, retry budgets and variable timeouts, applied consistently.
github.blog/news-insights/company-news/the-august-17-outage-and-the-work-ahead/
Postmortem
Slack2021-02
Slack's Outage on January 4th 2021
Unusually candid about the scaling response becoming a second failure. Cold client caches
on the first Monday back, an overloaded transit gateway, two autoscaling signals firing
together, and a provisioning service that hit an operating system limit and a cloud quota
while talking over the degraded network.
Carry forwardLoad-test the provisioning path itself, under the network conditions in which you will need it.
slack.engineering/slacks-outage-on-january-4th-2021/
Source
Envoy2023-10
Issue #30205: circuit breaker retry budgets count retries inconsistently
The recommended mechanism's own bug report. Retries in backoff are counted against the
limit but excluded from the denominator that sets it, so even a 100% budget rejects. The
effective budget also varies by HTTP version. Closed as not planned.
Carry forwardVerify your budget with a rejection metric under load. Do not trust the configured percentage.
github.com/envoyproxy/envoy/issues/30205
Source
Envoy2023-11 to 2024-01
PR #30738: retry budgets count scheduled retries towards budget
The first attempt to fix the accounting. Reviewers worried about breaking existing users
and about the cost of the new gauges, one maintainer said the change warranted more
discussion, and it was closed in January 2024 in favour of a redesign that also did not
land.
Carry forwardCorrecting a resource-accounting bug is a behaviour change for everyone relying on the incorrect behaviour, which is why these stall.
github.com/envoyproxy/envoy/pull/30738
Source
Envoy2026-03 to 2026-05
PR #43792: attempt admission control extension point
Closed unmerged by stalebot in May 2026. The thread is the interesting part: contributors
disclose that their employers already run internal implementations for prioritised
shedding of retries, while the upstream argument is about whether this deserves a specific
extension point or a universal one for circuit breaking.
Carry forwardThe good version of this control exists privately at large operators. If you are not one, you are building on the public version with its known gap.
github.com/envoyproxy/envoy/pull/43792
Source
gRPC2024-06
grpc-java #11274: retry throttling not respected with default service config
Throttling is wired up only when the service config arrives from the name resolver. With
a default service config and no resolver-supplied one, the throttle is bypassed and every
retry executes. A configured control that does nothing, which is the worst state for a
safety mechanism to be in.
Carry forwardConfiguration provenance changes behaviour in client libraries. Test the control in the deployment shape you actually ship.
github.com/grpc/grpc-java/issues/11274
Source
Netflixcurrent
Netflix/concurrency-limits
The library and its README, which is really a short design document. Equates a service's
concurrency limit to a TCP congestion window, ships Vegas, Gradient2 and AIMD limiters,
and is explicit that the server-side limiter exists to survive retry storms and batch
traffic the service does not control.
Carry forwardDrive the limit from queue delay, not from CPU. Latency change is the signal that a queue is forming.
github.com/Netflix/concurrency-limits
Source
Envoycurrent
circuit_breaker.proto API reference
The shipped defaults, which is what most deployments run: budget_percent at
20%, min_retry_concurrency at 3, and max_retries at 3 for the
static alternative. Worth reading alongside issue #30205 to see what the percentage is a
percentage of.
Carry forwardA budget is a ratio of live work; a max_retries is a count. Only the ratio scales with your traffic.
envoyproxy.io/docs/envoy/latest/api-v3/config/cluster/v3/circuit_breaker.proto
Decision record
gRPCcurrent
gRFC A6: client retries
The design document for retries, hedging and throttling in every gRPC implementation.
Specifies the per-server token bucket, the transparent retries that happen regardless of
policy, the retryable status code rules, and server pushback via
grpc-retry-pushback-ms, including the negative value that means do not retry
at all.
Carry forwardGive servers a way to tell clients to stop. A pushback header is cheaper than every client guessing.
github.com/grpc/proposal/blob/master/A6-client-retries.md
Decision record
Kubernetescurrent
KEP-1040: API Priority and Fairness
The argument for replacing a single global in-flight cap with priority levels, fair
queuing and shuffle sharding, written as a design proposal with the failure scenarios
spelled out: heartbeats crowded out, priority inversion via admission webhooks, one buggy
controller taking down the cluster.
Carry forwardA single admission cap decides who loses by accident. Priority levels decide it in advance, in review.
github.com/kubernetes/enhancements KEP-1040
Eng blog
Google2016
Site Reliability Engineering, chapter 22: Addressing Cascading Failures
The first widely read public statement of the retry budget and of the rule to retry at
one level only. Also carries the recovery sequence that every incident in this guide
eventually followed: reduce load until the crashing stops, let servers become healthy,
ramp gradually.
Carry forwardAttempts multiply as the product across layers. That single sentence is the whole capacity argument.
sre.google/sre-book/addressing-cascading-failures/
Eng blog
Meta2014-11
Solving the mystery of link imbalance
Nathan Bronson on a failure that took two years, several premature root causes, switches
from a different vendor and a firmware feature before anyone found it. The cause was a
most-recently-used connection pool preferring whichever network link was slowest. The fix
was one line.
Carry forwardAny policy that prefers the most recently used resource is a positive feedback loop under contention.
engineering.fb.com/2014/11/14/production-engineering/solving-the-mystery-of-link-imbalance-a-metastable-failure-state-at-scale/
Eng blog
Meta2015-11
Fail at Scale (Ben Maurer), as summarised by the morning paper
Meta's queue-side controls, published years before the failure class had a name: CoDel
with a 5 ms target and a 100 ms interval, adaptive LIFO so that once a queue forms new
requests go to the front and at least some meet their deadline, and per-service caps on
outstanding client requests.
Carry forwardUnder overload, FIFO guarantees that everyone misses their deadline. LIFO guarantees that somebody does not.
blog.acolyer.org/2015/11/19/fail-at-scale-controlling-queue-delay/
Eng blog
Uber2023-11
Cinnamon: using century-old tech to build a mean load shedder
The most quantitative countermeasure post in the set. Why hand-tuned per-service limits
did not survive thousands of microservices, the measured goodput collapse of the old
shedder at three times capacity, and a replacement built from a PID controller and a
TCP-Vegas variant that needs no per-service configuration.
Carry forwardThe cost of a badly tuned shedder is measurable: 40% of capacity delivered, with oscillation between success and error.
uber.com/en-IN/blog/cinnamon-using-century-old-tech-to-build-a-mean-load-shedder/
Eng blog
Marc Brooker2021-05
Metastability and Distributed Systems
A senior AWS engineer's reading of the HotOS paper, and the clearest short statement of
why optimising the common case builds the loop. Frames the metastable state as "Up, but
down. Working, but broken", which is the line that makes it recognisable on a dashboard
where throughput looks fine.
Carry forwardWatch goodput, not throughput. A system in this state is busy, and busy is what your traffic graph shows.
brooker.co.za/blog/2021/05/24/metastable.html
Eng blog
Amazon2015-03
Exponential Backoff And Jitter
The 2015 post that put full jitter and decorrelated jitter into every AWS SDK and most
client libraries since. Worth reading for what it does and does not claim: it reduces
contention and call counts, and it says nothing about bounding total work.
Carry forwardJitter decorrelates a herd. It does not cap one. Do not let it stand in for a budget in a design review.
aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
Eng blog
Grab2019-03
Designing Resilient Systems Beyond Retries, part 1
A ride-hailing platform's argument for server-side rate limiting as the primary defence,
on the grounds that client-side controls can fail or be bypassed and that coordinating
circuit-breaker configuration across hundreds of microservices is not sustainable.
Carry forwardA server that depends on its clients for protection has no protection. Client controls are an optimisation on top.
engineering.grab.com/beyond-retries-part-1
Eng blog
Cloudflare2026
Code Orange: Fail Small
Included as a contrast case rather than a retry story. Cloudflare's global incidents of
November and December 2025 propagated through configuration rather than load, and the
structural response is staged rollout with health mediation plus validated defaults that
fail open.
Carry forwardBlast radius and feedback loops are different problems. Cellular isolation limits one and does nothing for the other.
blog.cloudflare.com/fail-small-resilience-plan/
Vendor
Amazonretrieved 2026-08
Timeouts, retries, and backoff with jitter (Builders' Library)
Marc Brooker writing AWS practice rather than AWS marketing, which puts it well above the
usual vendor tier. Carries the 243 times arithmetic, the argument that retries are
selfish, the explicit rejection of circuit breakers in favour of token buckets, and the
note that this went into the SDKs in 2016.
Carry forwardRetry at a single point in the stack, and use consistent per-host jitter on scheduled work so that patterns stay diagnosable.
d1.awsstatic.com · timeouts-retries-and-backoff-with-jitter.pdf
Vendor
Envoycurrent
Circuit breaking, architecture overview
Short, and useful for one sentence: the project recommends retry budgets over static
circuit breaking, and says that if you insist on static breaking you should break retries
aggressively. That is a proxy vendor telling you its own default is the weaker option.
Carry forwardIf you keep max_retries, set it low and alarm on the overflow counter, which is the URX response flag.
envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/circuit_breaking
Talk
USENIX OSDI '222022-07-11
Metastable Failures in the Wild, conference presentation
The conference record for the survey paper, with slides and presentation video attached
alongside the PDF. Useful if you need to put the incident table in front of a review board
and want the citation rather than the blog summary.
Carry forwardCite the primary. Several widely shared summaries of this paper get the sample size and the AWS statistic wrong.
usenix.org/conference/osdi22/presentation/huang-lexiang
Talk
SREcon23 APAC2023-06-16
Mastering Chaos: observability-driven prioritized load shedding
A vendor-affiliated talk, so weigh the product claims accordingly, but slides 3 to 10 are
the best short visual explanation of the loop available. Slide 4 frames it through
Little's law, slide 8 shows retries increasing pressure on the database, and slide 9 shows
permanent overload persisting after capacity is restored.
Carry forwardLittle's law is the framing that makes concurrency the controlled variable rather than requests per second.
usenix.org/conference/srecon23apac/presentation/gill
Vendor
USENIX2023-06-16
SREcon23 APAC slide deck (PDF)
The deck for the talk above, cited here because the specific slides are quotable and the
video is not. Thirty-six slides; the material relevant to this guide is in the first
eleven, before the product content begins.
Carry forwardWhen citing a talk, cite the deck. Slide numbers are checkable and timestamps in a video are not.
usenix.org/system/files/srecon23apac_slides-gill_0.pdf