System Design Space

    Глава 19

    Обновлено: 15 февраля 2026 г. в 16:45

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

    Прогресс части0/8

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

    Классика

    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