Skip to Content

Особенности работы API и управление нагрузкой

AI Server взаимодействует с клиентом через API. Настоящее руководство не описывает установку с использованием Kubernetes и других средств балансировки и резервирования компонентов сервиса. В отсутствие этих механизмов сервис рискует перейти в состояние частичной или полной недоступности при высокой нагрузке на API.

Чтобы предотвратить такие сценарии и гарантировать стабильность и справедливость обслуживания, применяются механизмы ограничения нагрузки (Rate Limiting). Эти механизмы можно реализовать на разных уровнях: они реализованы на стороне самого сервиса, а также в nginx, который обрабатывает входящий трафик. Далее мы рассмотрим базовые рекомендации по взаимодействию клиентов с API AI Server, а также порядок действий для ограничения нагрузки с помощью очередей в nginx.

Рекомендации по ограничению нагрузки на API сервиса

Для обеспечения стабильной работы API сервиса в текущей конфигурации необходимо соблюдать приведенные ниже ограничения.

1. Общие рекомендации

  • Клиенты должны регулировать частоту запросов, чтобы не создавать избыточную нагрузку на сервер.
  • По-умолчанию минимальный интервал между запросами одного клиента — 50 мс (настраивается на стороне клиента).

2. Специфичные рекомендации для разных типов запросов

Тип запросаИнтервал между запросами
POST /inference/smartOcr/50 мс.
GET /inference/smartOcr/{requestKey}50 мс.
POST /inference/nlp/{modelType}/async50 мс.
GET /inference/nlp/{modelType}/{requestKey}50 мс.
Прочие запросыНе требуется (не предполагается высокой нагрузки)

3. Рекомендации по реализации на клиентской стороне

  • Очередь запросов:

    • Запросы одного типа должны отправляться последовательно, а не параллельно.
    • Может быть реализована как единая очередь, так и несколько отдельных очередей на каждый тип запроса.
    • Между окончанием обработки одного запроса и отправкой следующего должен быть интервал ≥50 мс.
  • Дополнительно, опционально, экспоненциальный backoff при ошибках:

    • Если сервер возвращает 429 (Too Many Requests) или 503 (Service Unavailable), клиент должен увеличить интервал между запросами (например, по алгоритму 50 мс → 100 мс → 200 мс и т. д.).
    • Интервал должен уменьшаться спустя продолжительное время.

Настройка контроля нагрузки на стороне nginx

Описанные выше правила — это “джентльменское соглашение” с клиентами. Однако для защиты от клиентов, где не реализованы описанные выше рекомендации, реализована защита на стороне прокси-сервера nginx. Для этого использован модуль ngx_http_limit_req_module: он организует очередь запросов.

По-умолчанию организовано 5 зон:

  • inference_ext_post_limit, зона для API создания запросов Умного OCR
  • inference_ext_get_limit, зона для API получения результатов запросов Умного OCR
  • inference_ext_tracking_limit, зона для внутренних взаимодействий API и агентов целевых машин
  • inference_limit, дополнительная зона для всех остальных запросов к сервису Api.Inference
  • api_limit, дополнительная зона для всех остальных запросов к Api

Если сервис под нагрузкой отдает ошибки 429 / 503, скорректируйте настройки зон.

  1. Откройте на редактирование файл конфигурации nginx.conf
  • При установке серверной части с использованием Docker:
sudo nano /app/Primo.AI/Api/volumes/nginx/nginx.conf
  • При установке серверной части без Docker:
sudo nano /etc/nginx/nginx.conf
  1. Скорректируйте стандартные параметры limit_req_zone: уменьшите допустимую частоту запросов rate, пока деградация при нагрузке не исчезнет.