PRO

Что такое Circuit Breaker? Retry с exponential backoff?

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

Проблема каскадных сбоев

Если downstream-сервис отвечает медленно или недоступен, каждый запрос может удерживать соединение, поток или worker до timeout. При большом числе запросов это истощает ресурсы вызывающего сервиса и может распространить сбой на всю систему.

Состояния Circuit Breaker

  • Closed — запросы проходят к зависимости, ошибки учитываются;

  • Open — новые вызовы временно не отправляются, сервис быстро возвращает fallback или ошибку;

  • Half-open — после cooldown breaker пропускает ограниченное число пробных запросов, чтобы проверить восстановление зависимости.

API service
  |
Circuit Breaker
  |
Payment provider

Closed -- failures exceed threshold --> Open
Open -- cooldown expires --> Half-open
Half-open -- success --> Closed
Half-open -- failure --> Open

Retry и exponential backoff

Retry полезен только для временных ошибок, например сетевого timeout, 503 или кратковременного сбоя. Exponential backoff увеличивает паузу между попытками: например 1, 2, 4, 8 секунд. Jitter добавляет случайное отклонение, чтобы множество клиентов не повторили запрос одновременно.

import random
import time


def retry(operation, attempts: int = 3) -> None:
    for attempt in range(attempts):
        try:
            return operation()
        except TemporaryError:
            if attempt == attempts - 1:
                raise

            delay = min(2 ** attempt, 10)
            jitter = random.uniform(0, delay)
            time.sleep(jitter)

Правила безопасного retry

  • ставить timeout на каждый внешний вызов;

  • повторять только временные и ожидаемые ошибки;

  • ограничивать число попыток и общий retry budget;

  • повторять только идемпотентные операции либо применять idempotency key;

  • использовать fallback или graceful degradation при открытом breaker.

Как ответить на собеседовании

Circuit Breaker останавливает вызовы нестабильной зависимости после порога ошибок и защищает сервис от каскадного сбоя. Retry с exponential backoff и jitter применяю только к временным ошибкам, с timeout и ограничением попыток. Retry безопасен для идемпотентных операций; для создания заказа или платежа сначала нужен idempotency key.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге