Что такое Circuit Breaker? Retry с exponential backoff?
Подробный ответ
Проблема каскадных сбоев
Если 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 --> OpenRetry и 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.
Оцени свой прогресс