System Design Space
Граф знанийНастройки

Обновлено: 24 марта 2026 г. в 17:36

Паттерны отказоустойчивости: Circuit Breaker, Bulkhead, Retry

medium

Практический разбор resilience-паттернов для распределённых систем: как ограничивать каскадные сбои и управлять деградацией сервиса.

Устойчивость системы определяется не числом паттернов в презентации, а тем, как она ведет себя, когда одна зависимость уже деградировала и тянет за собой остальные.

Глава связывает circuit breaker, bulkhead, retry, fail fast, graceful degradation, fallback и async recovery в одну модель ограничения blast radius, где важно понимать не только что включить, но и когда эти механизмы сами начинают ухудшать ситуацию.

На interview и design review материал полезен тем, что позволяет обсуждать retry storms, resource contention, overload behavior и manual override paths как реальные failure semantics, а не как набор красивых resilience buzzwords.

Практическая польза главы

Failure budget

Связывайте resilience-паттерны с SLO и error budget, чтобы устойчивость была управляемой, а не декларативной.

Изоляция отказов

Комбинируйте circuit breaker, bulkhead и timeout policies для ограничения blast radius между зависимостями.

Градуальная деградация

Проектируйте fallback-уровни сервиса и feature shedding так, чтобы пользователь видел предсказуемое поведение в инциденте.

Interview robustness

Показывайте на интервью не только паттерны, но и их параметры, триггеры срабатывания и метрики эффективности.

Классика

Release It!

Эта глава даёт современную практическую рамку для тех же resilience-принципов.

Открыть главу

Паттерны отказоустойчивости нужны, чтобы сбой зависимости не превращался в каскадный отказ всей системы. `Circuit Breaker`, `Bulkhead` и `Retry` работают как единый набор: ограничить blast radius, сохранить контролируемую деградацию и дать системе шанс восстановиться без потери ключевых пользовательских сценариев.

Circuit Breaker

Мотивация: если деградировавшая dependency продолжает получать полный поток запросов, очередь растёт, latency ухудшается и сбой начинает распространяться на остальные сервисы. Circuit Breaker быстро разрывает этот контур и защищает систему от каскадной перегрузки.

Closed

Трафик проходит как обычно, система собирает метрики ошибок и latency.

Open

Запросы к деградировавшей зависимости быстро отклоняются, чтобы не накапливать очередь и не тратить ресурсы.

Half-Open

Пробные запросы проверяют восстановление зависимости перед возвратом в Closed.

Визуализация Circuit Breaker

Circuit Breaker Simulator

state: closed
cooldown: 0
fail streak: 0

Request Queue

CB-101OK
/payments
CB-102FAIL
/payments
CB-103FAIL
/payments
CB-104FAIL
/payments

Breaker Policy

failure threshold = 3

open cooldown = 2 cycles

success

0

failures

0

rejected

0

Готово

Готово к симуляции. Запусти авто-режим или сделай один шаг.

Последнее решение: —

Bulkhead isolation

Мотивация: когда все функции делят общие пулы ресурсов, одна noisy нагрузка может «съесть» поток/соединения и уронить даже критичные пользовательские сценарии. Bulkhead изолирует ресурсы и ограничивает blast radius на уровне контуров.

Отдельные thread pools/connection pools для критичных и некритичных операций.
Изоляция очередей и ограничение concurrency per dependency.
Resource quotas на уровне сервиса/тенанта, чтобы один noisy neighbor не уронил весь контур.
Разделение control plane и data plane, чтобы операционные команды работали даже при partial outage.

Визуализация Bulkhead

Bulkhead Simulator

completed: 0
dropped: 0

Incoming Queue

BH-201background
duration: 3 ticks
BH-202background
duration: 3 ticks
BH-203background
duration: 2 ticks
BH-204critical
duration: 2 ticks

Isolation Policy

critical and background pools are isolated

Critical lane

queue: 0/3

inflight: 0completed: 0dropped: 0

Background lane

queue: 0/3

inflight: 0completed: 0dropped: 0
Готово

Готово к симуляции. Запусти авто-режим или сделай один шаг.

Последнее решение: —

Важно

Консистентность и идемпотентность

Ретраи без идемпотентности часто создают бизнес-дубли и несогласованное состояние.

Открыть главу

Retry patterns

Мотивация: временные ошибки неизбежны в распределённых системах, и retry помогает восстановить успешность без участия пользователя. Но без лимитов, backoff и jitter ретраи сами становятся источником перегрузки, поэтому policy должна быть строго управляемой.

Retry только для transient ошибок; для deterministic ошибок ретраи вредят.

Exponential backoff + jitter обязательно, чтобы избежать синхронных retry-storm.

Retry budget должен быть ограничен и согласован с timeout budget.

Идемпотентность операций обязательна, иначе ретраи создают дубли и side effects.

При перегрузке dependency лучше fail fast с деградацией, чем бесконечно ждать.

Визуализация Retry

Retry Simulator

succeeded ops: 0
failed ops: 0
attempts total: 0

Operation Queue

RT-301max 4
CreateOrder
RT-302max 4
ReserveInventory
RT-303max 4
SendWebhook
RT-304max 4
UpdateLedger

Retry Policy

exponential backoff + jitter

idempotency key is required

Attempt Timeline

Запусти шаг, чтобы увидеть ретраи.

Готово

Готово к симуляции. Запусти авто-режим или сделай один шаг.

Последнее решение: —

Retry без idempotency key может создавать дубли и неконсистентные side effects.

Fallback strategies

Graceful degradation

Отключайте второстепенные функции (recommendations, enrichment), сохраняя core user flow.

Stale cache

Отдавайте последние валидные данные при недоступности источника с явной маркировкой freshness.

Queue + async recovery

Критичные операции принимаются в очередь и дорабатываются асинхронно после восстановления зависимости.

Static/default response

Безопасный fallback-ответ вместо hard error для non-critical путей.

Практический чеклист

Для каждого external call задан timeout, retry policy и circuit breaker thresholds.

Определены KPI деградации: availability, latency, backlog, drop rate.

Есть runbook для forced-open breaker и ручного override.

Тесты покрывают каскадный отказ dependency и поведение fallback.

Resilience-параметры периодически пересматриваются по incident/postmortem данным.

Частый anti-pattern: ставить aggressive retry без ограничения concurrency и без jitter.

References

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки