Circuit Breaker
NORA включает circuit breaker на уровне каждого реестра, который отслеживает сбои вышестоящих реестров и мгновенно отклоняет запросы, когда известно, что реестр недоступен. Это предотвращает каскадное распространение медленных таймаутов в ваши сборочные пайплайны.
Circuit breaker по умолчанию отключён и должен быть включён явно.
Переменные окружения
Заголовок раздела «Переменные окружения»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_CB_ENABLED | false | Включить circuit breaker для вышестоящих реестров |
NORA_CB_THRESHOLD | 5 | Число последовательных сбоев перед размыканием цепи |
NORA_CB_RESET_TIMEOUT | 30 | Секунд ожидания перед пробным запросом к отказавшему вышестоящему реестру |
Как это работает
Заголовок раздела «Как это работает»Circuit breaker работает как конечный автомат с тремя состояниями для каждого вышестоящего реестра:
success ┌─────────────────────┐ │ │ ▼ N failures │Closed ──────────► Open ──(reset_timeout)──► HalfOpen ▲ │ │ │ │ reject (503 + │ probe │ │ Retry-After) │ succeeds │ ▼ │ │ caller gets 503 │ └────────────────────────────────────────────┘ probe fails → back to OpenClosed — Нормальная работа. Все запросы проходят к вышестоящему реестру. Каждый сбой увеличивает счётчик.
Open — Вышестоящий реестр отказал failure_threshold раз подряд. Все прокси-запросы немедленно получают 503 Service Unavailable с заголовком Retry-After. Подключения к вышестоящему реестру не выполняются.
HalfOpen — Через reset_timeout секунд пропускается один пробный запрос. Если он успешен, breaker замыкается (closed). Если нет — breaker снова размыкается (open).
config.toml
Заголовок раздела «config.toml»[circuit_breaker]enabled = truefailure_threshold = 5reset_timeout = 30Переопределения для отдельных реестров
Заголовок раздела «Переопределения для отдельных реестров»Переопределите порог или таймаут для конкретных реестров. Формат ключа — "registry:url":
[circuit_breaker]enabled = truefailure_threshold = 5reset_timeout = 30
[circuit_breaker.overrides."docker:https://registry-1.docker.io"]failure_threshold = 10reset_timeout = 120
[circuit_breaker.overrides."npm:https://registry.npmjs.org"]failure_threshold = 3reset_timeout = 60Это позволяет более терпимо относиться к эпизодическим сбоям Docker Hub, но при этом быстрее отсекать нестабильные вышестоящие реестры npm.
Метрики Prometheus
Заголовок раздела «Метрики Prometheus»| Метрика | Тип | Метки | Описание |
|---|---|---|---|
nora_circuit_breaker_state | Gauge | registry | Текущее состояние: 0 = Closed, 1 = Open, 2 = HalfOpen |
nora_circuit_breaker_rejections_total | Counter | registry | Общее число запросов, отклонённых разомкнутым breaker |
Пример алерта (Prometheus):
- alert: NoraCircuitBreakerOpen expr: nora_circuit_breaker_state == 1 for: 5m labels: severity: warning annotations: summary: "NORA circuit breaker open for {{ $labels.registry }}"Пример: Docker Compose
Заголовок раздела «Пример: Docker Compose»services: nora: image: getnora/nora:latest environment: NORA_CB_ENABLED: "true" NORA_CB_THRESHOLD: "5" NORA_CB_RESET_TIMEOUT: "30" ports: - "4000:4000"Смотрите также
Заголовок раздела «Смотрите также»- Справочник по конфигурации — полный справочник по переменным окружения
- Docker-прокси — настройка вышестоящего прокси
- Развёртывание в продакшене — руководство по продакшен-развёртыванию