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

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

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

ПеременнаяПо умолчаниюОписание
NORA_RATE_LIMIT_UPLOAD_RPS200Запросов на загрузку в секунду
NORA_RATE_LIMIT_UPLOAD_BURST500Максимальный всплеск для загрузки
NORA_RATE_LIMIT_GENERAL_RPS100Общих запросов в секунду
NORA_RATE_LIMIT_GENERAL_BURST200Максимальный всплеск для общих запросов
NORA_RATE_LIMIT_AUTH_RPS10Запросов аутентификации в секунду
NORA_RATE_LIMIT_AUTH_BURST20Максимальный всплеск для аутентификации
NORA_RATE_LIMIT_ENABLEDtrueВключение/отключение ограничения
Окно терминала
docker run -d \
--name nora \
-p 4000:4000 \
-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_limit]
enabled = true

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

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

Сценарий использования: Редкие сборки, ручная публикация, небольшой 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 24/7, глобальные развёртывания


Описание параметров ограничения частоты запросов

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

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

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

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

  • nora_http_requests_total{registry, method, status} — общее количество HTTP-запросов по реестру, методу и коду ответа
# Частота запросов за 5 минут
rate(nora_http_requests_total[5m])
# Запросы с ошибкой 429 (ограниченные)
rate(nora_http_requests_total{status="429"}[5m])
groups:
- name: nora_rate_limits
rules:
- alert: NoraHighRateLimitHits
expr: rate(nora_http_requests_total{status="429"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "NORA experiencing high rate limit violations"
description: "{{ $value }} rate-limited requests per second"

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

Решение:

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

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

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

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

Решение:

Окно терминала
# Increase upload limits
NORA_RATE_LIMIT_UPLOAD_RPS=2000
NORA_RATE_LIMIT_UPLOAD_BURST=5000

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

Решение:

Окно терминала
# Increase general limits
NORA_RATE_LIMIT_GENERAL_RPS=1000
NORA_RATE_LIMIT_GENERAL_BURST=2000

  1. Начинайте консервативно — начните со значений по умолчанию и увеличивайте на основе метрик
  2. Мониторьте постоянно — настройте алерты Prometheus для отслеживания срабатываний лимитов
  3. Планируйте пиковые нагрузки — устанавливайте значения BURST выше RPS для обработки всплесков трафика
  4. Разделяйте Upload/General — настраивайте независимо в зависимости от паттернов использования
  5. Документируйте изменения — ведите учёт корректировок лимитов и их причин
  6. Нагрузочное тестирование — тестируйте новые лимиты в staging-среде перед продакшеном

Ограничение частоты запросов в NORA очень эффективно:

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

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