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

Настройка ограничений частоты запросов

NORA реализует ограничение частоты запросов для защиты реестра от чрезмерной нагрузки. В этом руководстве описаны значения по умолчанию, рекомендации по тонкой настройке и мониторинг.

ПеременнаяПо умолчаниюОписание
NORA_RATE_LIMIT_ENABLEDtrueВключение/отключение ограничений
NORA_RATE_LIMIT_UPLOAD_RPS200Запросов загрузки в секунду
NORA_RATE_LIMIT_UPLOAD_BURST500Пиковое значение для загрузок
NORA_RATE_LIMIT_GENERAL_RPS500Общих запросов в секунду
NORA_RATE_LIMIT_GENERAL_BURST1000Пиковое значение для общих запросов
Окно терминала
docker run -d \
--name nora \
-p 5000:5000 \
-v /data/nora:/data \
-e NORA_RATE_LIMIT_UPLOAD_RPS=2000 \
-e NORA_RATE_LIMIT_UPLOAD_BURST=5000 \
-e NORA_RATE_LIMIT_GENERAL_RPS=1000 \
-e NORA_RATE_LIMIT_GENERAL_BURST=2000 \
ghcr.io/getnora-io/nora:latest serve
services:
nora:
image: ghcr.io/getnora-io/nora:latest
environment:
NORA_RATE_LIMIT_UPLOAD_RPS: 2000
NORA_RATE_LIMIT_UPLOAD_BURST: 5000
NORA_RATE_LIMIT_GENERAL_RPS: 1000
NORA_RATE_LIMIT_GENERAL_BURST: 2000
rate_limits:
upload:
rps: 2000
burst: 5000
general:
rps: 1000
burst: 2000
Окно терминала
nora serve \
--rate-limit-upload-rps 2000 \
--rate-limit-upload-burst 5000 \
--rate-limit-general-rps 1000 \
--rate-limit-general-burst 2000

Небольшая команда (менее 10 разработчиков)

Заголовок раздела «Небольшая команда (менее 10 разработчиков)»

Значений по умолчанию достаточно:

Окно терминала
NORA_RATE_LIMIT_UPLOAD_RPS=200
NORA_RATE_LIMIT_UPLOAD_BURST=500
NORA_RATE_LIMIT_GENERAL_RPS=500
NORA_RATE_LIMIT_GENERAL_BURST=1000

Сценарий использования: Нечастые сборки, ручная загрузка образов, небольшой CI/CD-конвейер


Рекомендуется умеренное увеличение:

Окно терминала
NORA_RATE_LIMIT_UPLOAD_RPS=1000
NORA_RATE_LIMIT_UPLOAD_BURST=2000
NORA_RATE_LIMIT_GENERAL_RPS=750
NORA_RATE_LIMIT_GENERAL_BURST=1500

Сценарий использования: Регулярный CI/CD, несколько параллельных сборок, активная разработка


Крупная команда (50+ разработчиков, интенсивный CI/CD)

Заголовок раздела «Крупная команда (50+ разработчиков, интенсивный CI/CD)»

Значительное увеличение для высокой пропускной способности:

Окно терминала
NORA_RATE_LIMIT_UPLOAD_RPS=2000
NORA_RATE_LIMIT_UPLOAD_BURST=5000
NORA_RATE_LIMIT_GENERAL_RPS=1000
NORA_RATE_LIMIT_GENERAL_BURST=2000

Сценарий использования: Непрерывное развёртывание, матричные сборки, частая загрузка образов


Корпоративное / мультитенантное развёртывание

Заголовок раздела «Корпоративное / мультитенантное развёртывание»

Индивидуальная тонкая настройка под нагрузку:

Окно терминала
NORA_RATE_LIMIT_UPLOAD_RPS=5000
NORA_RATE_LIMIT_UPLOAD_BURST=10000
NORA_RATE_LIMIT_GENERAL_RPS=2000
NORA_RATE_LIMIT_GENERAL_BURST=5000

Сценарий использования: Несколько команд, круглосуточный CI/CD, глобальные развёртывания


  • Определение: Средняя допустимая частота запросов в устойчивом режиме
  • Пример: RPS=200 означает 200 запросов в секунду в среднем
  • Эффект: Запросы, превышающие эту частоту, будут ограничены
  • Определение: Максимальное число запросов, допустимое в кратковременном пике
  • Пример: BURST=500 допускает до 500 запросов при кратковременной пиковой нагрузке
  • Эффект: Позволяет обрабатывать всплески трафика без немедленного ограничения
  • Ограничения загрузки: Применяются к операциям отправки образов (PUT, POST на /v2/)
  • Общие ограничения: Применяются ко всем остальным операциям (получение образов, каталог, теги)

Проверьте /metrics для получения статистики по ограничениям:

Окно терминала
curl http://localhost:4000/metrics | grep rate_limit

Ключевые метрики:

  • nora_rate_limit_hits_total{type="upload"} — срабатывания ограничений загрузки
  • nora_rate_limit_hits_total{type="general"} — срабатывания общих ограничений
  • nora_requests_total — общее число обработанных запросов
# Частота срабатывания ограничений за 5 минут
rate(nora_rate_limit_hits_total[5m])
# Процент запросов, попавших под ограничение
(rate(nora_rate_limit_hits_total[5m]) / rate(nora_requests_total[5m])) * 100
groups:
- name: nora_rate_limits
rules:
- alert: NoraHighRateLimitHits
expr: rate(nora_rate_limit_hits_total[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "Частое срабатывание ограничений в NORA"
description: "{{ $value }} срабатываний ограничений в секунду"
- alert: NoraRateLimitCritical
expr: (rate(nora_rate_limit_hits_total[5m]) / rate(nora_requests_total[5m])) > 0.1
for: 10m
labels:
severity: critical
annotations:
summary: "Более 10% запросов попадают под ограничение"
description: "Рассмотрите увеличение лимитов"

Причина: Превышены ограничения частоты запросов

Решение:

  1. Проверьте текущие значения ограничений
  2. Определите по /metrics, какое ограничение срабатывает (загрузка или общие запросы)
  3. Увеличьте соответствующие значения в зависимости от нагрузки
  4. Перезапустите NORA для применения новых ограничений

Симптом: медленная загрузка образов при CI/CD-сборке

Заголовок раздела «Симптом: медленная загрузка образов при CI/CD-сборке»

Причина: Ограничения загрузки слишком жёсткие для параллельных сборок

Решение:

Окно терминала
# Увеличить ограничения загрузки
NORA_RATE_LIMIT_UPLOAD_RPS=2000
NORA_RATE_LIMIT_UPLOAD_BURST=5000

Причина: Общие ограничения блокируют запросы метаданных

Решение:

Окно терминала
# Увеличить общие ограничения
NORA_RATE_LIMIT_GENERAL_RPS=1000
NORA_RATE_LIMIT_GENERAL_BURST=2000

  1. Начинайте с консервативных значений — используйте значения по умолчанию и увеличивайте на основе метрик
  2. Ведите постоянный мониторинг — настройте оповещения Prometheus при срабатывании ограничений
  3. Учитывайте пиковые нагрузки — задавайте BURST выше RPS для обработки всплесков трафика
  4. Настраивайте раздельно — тюнируйте ограничения загрузки и общие ограничения независимо, исходя из профиля нагрузки
  5. Документируйте изменения — фиксируйте корректировки ограничений и причины изменений
  6. Проводите нагрузочное тестирование — проверяйте новые значения в тестовой среде перед применением в промышленной

Механизм ограничения частоты запросов в NORA реализован максимально эффективно:

  • Накладные расходы: менее 1 мс на запрос
  • Память: пренебрежимо малое потребление (алгоритм маркерного ведра)
  • Процессор: минимальное влияние даже при высоких значениях RPS

Увеличение ограничений практически не влияет на производительность самого NORA. Ограничения существуют исключительно для защиты сервера от чрезмерной клиентской нагрузки.