Перейти к содержимому

Circuit Breaker

NORA включает circuit breaker на уровне каждого реестра, который отслеживает сбои вышестоящих реестров и мгновенно отклоняет запросы, когда известно, что реестр недоступен. Это предотвращает каскадное распространение медленных таймаутов в ваши сборочные пайплайны.

Circuit breaker по умолчанию отключён и должен быть включён явно.


ПеременнаяПо умолчаниюОписание
NORA_CB_ENABLEDfalseВключить circuit breaker для вышестоящих реестров
NORA_CB_THRESHOLD5Число последовательных сбоев перед размыканием цепи
NORA_CB_RESET_TIMEOUT30Секунд ожидания перед пробным запросом к отказавшему вышестоящему реестру

Circuit breaker работает как конечный автомат с тремя состояниями для каждого вышестоящего реестра:

success
┌─────────────────────┐
│ │
▼ N failures │
Closed ──────────► Open ──(reset_timeout)──► HalfOpen
▲ │ │
│ │ reject (503 + │ probe
│ │ Retry-After) │ succeeds
│ ▼ │
│ caller gets 503 │
└────────────────────────────────────────────┘
probe fails → back to Open

Closed — Нормальная работа. Все запросы проходят к вышестоящему реестру. Каждый сбой увеличивает счётчик.

Open — Вышестоящий реестр отказал failure_threshold раз подряд. Все прокси-запросы немедленно получают 503 Service Unavailable с заголовком Retry-After. Подключения к вышестоящему реестру не выполняются.

HalfOpen — Через reset_timeout секунд пропускается один пробный запрос. Если он успешен, breaker замыкается (closed). Если нет — breaker снова размыкается (open).


[circuit_breaker]
enabled = true
failure_threshold = 5
reset_timeout = 30

Переопределите порог или таймаут для конкретных реестров. Формат ключа — "registry:url":

[circuit_breaker]
enabled = true
failure_threshold = 5
reset_timeout = 30
[circuit_breaker.overrides."docker:https://registry-1.docker.io"]
failure_threshold = 10
reset_timeout = 120
[circuit_breaker.overrides."npm:https://registry.npmjs.org"]
failure_threshold = 3
reset_timeout = 60

Это позволяет более терпимо относиться к эпизодическим сбоям Docker Hub, но при этом быстрее отсекать нестабильные вышестоящие реестры npm.


МетрикаТипМеткиОписание
nora_circuit_breaker_stateGaugeregistryТекущее состояние: 0 = Closed, 1 = Open, 2 = HalfOpen
nora_circuit_breaker_rejections_totalCounterregistryОбщее число запросов, отклонённых разомкнутым breaker

Пример алерта (Prometheus):

- alert: NoraCircuitBreakerOpen
expr: nora_circuit_breaker_state == 1
for: 5m
labels:
severity: warning
annotations:
summary: "NORA circuit breaker open for {{ $labels.registry }}"

services:
nora:
image: getnora/nora:latest
environment:
NORA_CB_ENABLED: "true"
NORA_CB_THRESHOLD: "5"
NORA_CB_RESET_TIMEOUT: "30"
ports:
- "4000:4000"