Особенности работы 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}/async | 50 мс. |
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, скорректируйте настройки зон.
- Откройте на редактирование файл конфигурации nginx.conf
- При установке серверной части с использованием Docker:
sudo nano /app/Primo.AI/Api/volumes/nginx/nginx.conf
- При установке серверной части без Docker:
sudo nano /etc/nginx/nginx.conf
- Скорректируйте стандартные параметры limit_req_zone: уменьшите допустимую частоту запросов rate, пока деградация при нагрузке не исчезнет.