Retry without circuit breaker or load shedding
errorretry-without-adaptive-shedding
Retries into a service that can neither shed load nor have its circuit opened produce a metastable failure: the retries keep the dependency saturated long after the original fault is gone. Either break the circuit at the caller or put an adaptive limiter in front of the callee.
- Severity
- error
- Selects
- every edge
- Components in scope
- 2,366
It looks at every edge, and fires when:
- — all of these hold:
- — the edge's `retryPolicy` is one of "fixed", "exponential" or "exponential-jitter"
- — this does not hold:
- — the edge's `circuitBreaker` is true
- — the edge's target node:
- — this does not hold:
- — the node has at least one incoming edge from a rate-limiter
Edge '{{edge.from}}' -> '{{edge.to}}' retries without a circuit breaker, and '{{edge.to}}' has no rate limiter in front of it. Retry storms will cascade.This rule is about an edge, so it belongs to a pair of nodes rather than one component.
This rule names no kind: it reads the design as a whole.
Reference designs whose broken twin names this rule in its header. The gate reads the same header, and fails when a rule no design trips.
ad-click-aggregationreferencebooking-searchreferencecloudflare-edgereferencedigital-walletreferencedistributed-message-queuereferencedoordash-deliveryreferenceetsy-searchreferencefigma-multiplayerreferencegithub-mysqlreferencegojek-platformreferencegoogle-mapsreferencegrab-georeferencehotel-reservationreferencehotstar-streamingreferencelinkedin-kafkareferencelyft-envoyreferencemeta-threadsreferencemetrics-monitoringreferencenetflix-streamingreferencenubank-corereferencepokemon-goreferenceproximity-servicereferenceshopify-flash-salereferencesnapchat-platformreferencestock-exchangereferencestripe-paymentsreferencetinder-georeferenceuber-dispatchreferencewhatsapp-messagingreferencezoom-videoreference
# yaml-language-server: $schema=../schema/rule.schema.json # Retries into a service that cannot shed load or open a circuit are the recipe for a # metastable failure: the retries keep the dependency saturated after the original # fault is gone. Either break the circuit on the caller or put an adaptive limiter in # front of the callee. # Tripped by: designs/doordash-delivery.broken.yaml schemaVersion: "1" type: "rule" id: "retry-without-adaptive-shedding" severity: "error" select: edge: {} when: all: - field: "retryPolicy" in: ["fixed", "exponential", "exponential-jitter"] - not: field: "circuitBreaker" equals: true - to: not: hasEdge: direction: "in" peerKind: "rate-limiter" message: "Edge '{{edge.from}}' -> '{{edge.to}}' retries without a circuit breaker, and '{{edge.to}}' has no rate limiter in front of it. Retry storms will cascade."