Ответ
Circuit Breaker (Автоматический выключатель) — это паттерн проектирования, который используется для создания отказоустойчивых систем. Его главная цель — предотвратить каскадные сбои, когда отказ одного сервиса вызывает цепную реакцию отказов в других, зависимых от него сервисах.
Паттерн работает как электрический предохранитель: он отслеживает количество сбоев при обращении к внешнему ресурсу и, если их число превышает порог, «размыкает цепь» — временно прекращает отправку новых запросов.
Состояния Circuit Breaker
Closed(Замкнуто): Начальное состояние. Запросы свободно проходят к сервису. Счетчик ошибок сброшен.Open(Разомкнуто): Если количество ошибок за определенный период превышает порог, выключатель переходит в это состояние. Все последующие запросы к сервису немедленно отклоняются без попытки их выполнить. Это снижает нагрузку на неисправный сервис и позволяет ему восстановиться.Half-Open(Полуоткрыто): По истечении тайм-аута выключатель переходит в это состояние. Он пропускает один или несколько тестовых запросов к сервису. Если они успешны, выключатель возвращается в состояниеClosed. Если нет — снова вOpen.
Пример на Python с библиотекой pybreaker
import requests
import pybreaker
# Создаем Circuit Breaker:
# - fail_max=3: разомкнется после 3 неудач подряд
# - reset_timeout=30: через 30 секунд попробует снова (перейдет в Half-Open)
breaker = pybreaker.CircuitBreaker(fail_max=3, reset_timeout=30)
@breaker
def call_unstable_api(url):
"""Функция, защищенная автоматическим выключателем."""
print(f"Попытка вызова {url}...")
response = requests.get(url, timeout=2)
response.raise_for_status() # Вызовет исключение для кодов 4xx/5xx
return response.json()
try:
# При первых 3 сбоях будут реальные попытки вызова
# На 4-й раз вызов будет немедленно заблокирован с исключением pybreaker.CircuitBreakerError
data = call_unstable_api('https://httpstat.us/503')
except pybreaker.CircuitBreakerError:
print("Circuit Breaker разомкнут! Запрос заблокирован.")
except requests.exceptions.RequestException as e:
print(f"Ошибка сети: {e}")