Любая интеграция рано или поздно встречается с ограничениями API: частотой запросов, размерами пакетов и глубиной выборок. Понимание лимитов заранее избавляет от кода 429 в бою и от гонок при массовой синхронизации — правильная стратегия закладывается на этапе проектирования.
Частота запросов и код 429
Главное ограничение — частота обращений к API. RetailCRM считает запросы по аккаунту, и при превышении порога возвращает HTTP 429 Too Many Requests. Порог измеряется числом запросов в секунду и зависит от тарифа и типа аккаунта.
Практические следствия:
- несколько параллельных воркеров, бьющих в один аккаунт, суммируют нагрузку и быстрее упираются в лимит;
- пиковые массовые операции (импорт базы) нужно растягивать во времени;
- получив 429, нельзя просто повторять запрос сразу — это усугубит ситуацию.
Заголовки контроля лимитов
Ответы API сопровождаются служебными заголовками, по которым можно отслеживать остаток лимита и адаптировать темп. Ориентируйтесь на них вместо жёстко зашитых пауз:
| Заголовок | Значение |
|---|---|
X-Rate-Limit-Limit | Допустимое число запросов в окне |
X-Rate-Limit-Remaining | Сколько запросов ещё доступно |
Retry-After | Через сколько повторить после 429 |
Хорошая интеграция читает эти заголовки после каждого ответа и снижает темп, когда Remaining приближается к нулю, не дожидаясь отказа. Заголовок Retry-After, если он есть, задаёт минимальную паузу перед повтором.
Размеры пакетов и тел запросов
Пакетные методы ограничены количеством объектов за вызов. Ориентиры, которых стоит придерживаться:
/orders/upload,/customers/upload— до 50 объектов за запрос;- обновление остатков и цен — десятки предложений за вызов;
- фильтры-массивы (например
filter[ids][]) тоже не стоит раздувать до тысяч значений.
Превышение лимита пакета приведёт к ошибке валидации. Поэтому большие объёмы разбивают на партии: например, импорт 10 000 заказов — это 200 вызовов /orders/upload по 50 штук, распределённых во времени с учётом частоты.
Ограничения пагинации и глубины выборки
Списочные методы отдают максимум 100 записей на страницу (limit=100). Глубокая пагинация по page имеет два минуса: она нагружает базу и уязвима к смещению при параллельных изменениях данных.
Для полной и корректной выгрузки применяют курсорный обход:
- запросить первую страницу, отсортированную по id;
- взять максимальный id из ответа;
- следующий запрос — с
filter[sinceId], равным этому id; - повторять, пока приходят записи.
sinceId устойчив к вставке новых записей во время выгрузки: он не пропускает и не дублирует данные, в отличие от навигации по номеру страницы.Стратегии устойчивости: бэкофф и очереди
Надёжная интеграция проектируется так, чтобы лимиты не роняли обмен, а лишь замедляли его. Базовый набор приёмов:
- Экспоненциальный бэкофф: при 429 и 5xx повторять с растущей паузой (например, 1, 2, 4, 8 секунд) и джиттером;
- Очередь и единый лимитер: все запросы к аккаунту проходят через один ограничитель скорости, а не через независимых воркеров;
- Приоритеты: критичные операции (создание заказа) обслуживаются раньше фоновых выгрузок;
- Идемпотентность: повтор после сбоя не должен создавать дубли — опора на externalId.
Такой конвейер переживает всплески нагрузки и деградации API без потери данных.
Мониторинг и диагностика
Лимиты нужно наблюдать, а не угадывать. Что стоит логировать и отслеживать:
- долю ответов
429и5xxот общего числа запросов; - значения
X-Rate-Limit-Remainingв пиковые часы; - задержки обработки очереди и глубину отставания;
- количество повторов на операцию.
Рост доли 429 — сигнал, что пора распределять нагрузку по времени или пересматривать архитектуру обмена. Метрики также помогают отличить проблему на стороне API от собственных ошибок интеграции.
Итог
Ключевые ограничения API RetailCRM — частота запросов с кодом 429, размеры пакетов (до 50 объектов), лимит страницы в 100 записей и глубина пагинации. Устойчивость достигается чтением заголовков лимитов, экспоненциальным бэкоффом, единым лимитером и курсорным обходом через sinceId.
Мы проектируем высоконагруженные интеграции, которые уважают лимиты API: с очередями, приоритетами и мониторингом. Если обмен с RetailCRM должен работать при тысячах операций в час и не падать на пиках, поможем построить архитектуру, которая держит нагрузку.
Частые вопросы
Что означает код 429 от API?
Превышена допустимая частота запросов к аккаунту. Запрос корректен, но отклонён — нужно сделать паузу и повторить, а не менять данные.
Как узнать остаток лимита?
По заголовкам ответа X-Rate-Limit-Limit и X-Rate-Limit-Remaining. Заголовок Retry-After подсказывает паузу перед повтором после 429.
Сколько объектов помещается в пакетный запрос?
Методы upload принимают до 50 объектов за вызов. Большие объёмы разбивают на партии по 50 штук.
Как избежать 429 при массовом импорте?
Растяните операции во времени, пропускайте все запросы через единый лимитер скорости и применяйте экспоненциальный бэкофф.
Почему пагинация по page ненадёжна для полной выгрузки?
При вставке новых записей во время обхода смещение страниц сдвигается, и данные можно пропустить или задублировать. Надёжнее курсор по sinceId.
Суммируется ли нагрузка от нескольких воркеров?
Да. Лимит считается по аккаунту, поэтому параллельные воркеры складывают нагрузку и быстрее упираются в порог.
Что мониторить, чтобы не ловить лимиты?
Долю ответов 429 и 5xx, значения X-Rate-Limit-Remaining в пик, отставание очереди и число повторов на операцию.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.