ReliabilityAdvanced

How can retries make an outage worse?

“A payment provider slows down. Ten minutes later it is completely down and so is your checkout. Your services all retry on failure. Explain what happened and how to retry safely.”

What this tests

  • Retry amplification across layers as multiplication, not addition
  • Timeouts, retry budgets, backoff with jitter, and where retries belong
  • Circuit breakers as the mechanism that stops the storm
  • Distinguishing a slow dependency from a failed one

Answers by level

Read the beginner answer first and notice what is missing.

Retries multiply through layers. Client retries 3×, gateway retries 3×, order service retries 3× against the payment service: one user click becomes up to 27 calls to a provider that was already slow. The slowdown becomes an overload, the provider fails harder, more calls time out, more retries fire. That is a retry storm, and it turns a degradation into an outage — with your own traffic.

Safe retrying: retry in one layer, not every layer; retry only idempotent operations and only on errors that a retry can fix; use exponential backoff with jitter; cap with a retry budget (for example, retries may be at most 10% of the request rate) so a broad failure cannot amplify. And put a circuit breaker in front of the dependency so that once the failure rate crosses a threshold, calls fail fast for a cooling period instead of piling up — see Circuit Breaker and Reliability Patterns.

Green flags · Red flags

Strong green flag · Argues that a slow dependency is more dangerous than a dead one and configures the breaker for slow-call rate.
Green flags
  • Computes the amplification factor (3 × 3 × 3 = 27×)
  • Retries in one layer only, with backoff + jitter and a retry budget
  • Timeouts shorter than the caller's; mentions thread-pool exhaustion
  • Circuit breaker that counts slow calls, not only errors
  • A concrete degraded mode for checkout
Red flags
  • "Just increase the timeout so the retries have time to succeed."
  • Retries at every layer "for safety"
  • Retries non-idempotent calls without a key
  • Fixed 1 s retry delay with no jitter

Follow-up questions

F1
Where exactly does the breaker go, and what does it return when open?
F2
How do you size a retry budget?
F3
The provider is fine but p99 is 9 s. Does your design protect you?

Scenario

Provider latency rose from 300 ms to 4 s at 14:02. Your gateway (30 s timeout, 3 retries), order service (10 s, 3 retries) and payment client (5 s, 3 retries) all retried. By 14:09 the provider was rejecting connections and your checkout error rate was 100%; the provider's status page later said the traffic from your account had increased 20×. Reconstruct the failure and design the retry policy that would have kept checkout degraded but alive.

Learn this topic