Единица 8 / 11

Ограничения скорости и отказоустойчивое управление ошибками

Прибыль:

  • Может интерпретировать ограничения скорости (RPM/ITPM/OTPM) и ошибки 429.
  • Реализует экспоненциальную отсрочку и повторную попытку с помощью retry-after.
  • Правильно классифицирует и обрабатывает распространенные коды ошибок HTTP (400/401/429/500/529).

В производственной среде ни один API не всегда отвечает идеально. Иногда вы отправляете запросы слишком быстро и достигаете лимита; иногда сервер временно занят; Иногда ваш запрос неверен с самого начала. Что отличает надежную интеграцию от любительской попытки, так это то, что она обрабатывает такие ситуации прогнозируемо и автоматически. В этом модуле вы узнаете об ограничениях скорости (RPM/ITPM/OTPM), ошибке 429, повторной попытке с экспоненциальной задержкой и правильной классификации распространенных кодов ошибок HTTP. Цель: создать настолько надежный поток, чтобы пользователь его никогда не заметил.

Что такое ограничения скорости?

Провайдер ограничивает объем работы, которую коммутатор может выполнить за определенный период времени. Эта защита; Он защищает как инфраструктуру, так и вас от внезапного роста затрат. Существует три распространенных типа лимитов:

  • RPM (запросов в минуту): количество запросов в минуту.
  • ITPM (входные токены в минуту): входной токен, который может обрабатываться в минуту.
  • OTPM (выходные токены в минуту): токен вывода, который может производиться в минуту.

Если вы превысите любой из этих ограничений, провайдер отклонит запрос и вернет код ошибки 429. Лимиты обычно различаются в зависимости от уровня вашей учетной записи и могут со временем увеличиваться.

Совет: Вы можете следить за приближением к пределу из заголовков ответов. Большинство провайдеров сообщают об оставшейся квоте с помощью заголовков типа x-ratelimit-remaining-*. Мониторинг этих значений и регулирование трафика впереди — наиболее зрелый способ предотвратить проблему без получения ошибки 429.

429 и экспоненциальный ретрейсмент

429 (ограничение скорости) — это временная ошибка, которую можно повторить. Правильный ответ — подождать некоторое время запроса и повторить попытку. Но постоянного ожидания недостаточно; Если все попытаются еще раз одновременно, предел будет достигнут снова. Решением является экспоненциальная отсрочка: экспоненциальное увеличение времени ожидания с каждой неудачной попыткой.

# Пробная логика экспоненциальной отсрочки 1 → 429 → подождать 1 секунду, проба 2 → 429 → подождать 2 секунды, проба 3 → 429 → подождать 4 секунды, проба 4 → 429 → подождать 8 секунд (+ небольшое случайное "дрожание")... сдаться и сообщить после максимум N попыток

Добавление к этому небольшой случайности (дрожания) предотвращает конфликты запросов при одновременных повторных попытках. Кроме того, ответ 429 часто содержит заголовок «retry-after»: «попробуйте еще раз через это количество секунд». Уважать это звание правильнее, чем слепо ждать.

Внимание: когда вы получите ошибку 429, «форсирование путем отправки большего количества запросов» ухудшит ситуацию; Лимит продолжает заполняться, и никакие запросы не проходят. Правильная реакция – отступление, а не ускорение. Хорошие новости: большинство официальных SDK автоматически повторяют 429 и ошибки сервера с отсрочкой — используйте такое поведение SDK перед установкой вручную.

Классификация кодов ошибок HTTP

Не все ошибки одинаковы. Критическое различие: можно ли повторить попытку или это проблема запроса/идентификации?

Код

Значение

Можно ли попробовать еще раз?

правильный ответ

400

Неверный запрос (ошибка формата/параметра)

нет

Исправьте запрос; больше не отправляй то же самое

401

Ошибка аутентификации (ключ недействителен/отсутствует)

нет

Исправить ключ/название

403

Нет авторизации (нет доступа к модели/функции)

нет

Проверьте разрешения/область

404

Не найден (неправильный идентификатор модели/конечная точка)

нет

Правильный идентификатор/адрес модели

429

Превышен лимит скорости

Да

Отступление + повторная попытка после

500

Ошибка сервера

Да

Попробуйте еще раз с отступлением

529

Сервер перегружен

Да

Попробуйте еще раз с отступлением

Золотое правило: 429, 500 и 529 — временные; Повторная попытка с выводом средств. 400, 401, 403, 404 — проблемы запроса/идентификации; Повторная попытка не решит проблему и напрасно тратит усилия. Ваш код должен различать эти две группы.

Шаг за шагом: надежный звонок

  1. Отправьте запрос. В случае успеха продолжайте.
  2. Классифицируйте код ошибки. Можно ли попробовать еще раз?
  3. Если возможно: выполните повторную попытку, примените экспоненциальную задержку + джиттер, попробуйте ограниченное количество раз (например, максимум 5).
  4. Если не пробовали: Исправьте (формат/ключ) и остановитесь; Не повторяйте один и тот же ошибочный запрос в цикле.
  5. Подумайте о том, чтобы сдаться. Если после n попыток все еще не удалось, покажите пользователю вежливое сообщение и зарегистрируйте событие (блок отслеживания 11).

# Надежный вызов pseudo-codedene = 0repeat: response = request_at() if response.success: вернуть ответ if response.code в [429, 500, 529] и попробовать < 5: wait = retry_after ?? (2^try sec + джиттер) сон(подождите); попробуйте += 1; git еще раз, если код ответа.код в [400, 401, 403, 404]: save_error(response); return «запрос должен быть исправлен» return «постоянная ошибка, попробуйте позже»

# Вежливый отзыв пользователю (когда повторные попытки исчерпаны) «Я сейчас занят, мне не удалось обработать ваш запрос. Повторите попытку позже, или я сохранил ваш запрос, я свяжусь с вами, когда он будет готов».

Слабая подсказка/Сильная подсказка (здесь: дизайн сообщения об ошибке)

# WEAK (отображает пользователю необработанную ошибку) «Ошибка 429:rate_limit_error»

# СИЛЬНЫЙ (удобный, обнадеживающий, подсказывающий действие) «В системе произошла временная перегрузка. Мы благополучно получили ваш запрос, и он автоматически повторяется. Если результат не появится в течение нескольких секунд, вы можете обновить страницу».

Раскрытие грубой технической ошибки конечному пользователю не только подрывает доверие, но и может стать уязвимостью безопасности. Внутренне классифицируйте ошибки и дайте пользователю спокойное, ориентированное на действие сообщение; просто напишите техническую деталь для записи.

Три мини-кейса

Случай 1 — Лодка разбилась в результате взрыва. Бот службы поддержки клиентов получил 429 всплеска трафика в день кампании; В коде не было повторов, каждая ошибка отображалась непосредственно пользователю как «ошибка». Они добавили экспоненциальную коррекцию + повторную попытку; при том же трафике запросы проходили с задержкой в ​​несколько секунд, ошибок пользователь не видел.

Случай 2. Попытка 400 в цикле. Интеграция получала ошибку 404 из-за неверного идентификатора модели, но все ошибки рассматривались как «временные» и повторялись попытки в бесконечном цикле; Бревно раздулось и создалась ненужная нагрузка. Добавили классификацию ошибок: 404 считается постоянным, цикл останавливается и исправляется идентификатор модели. Урок: не повторяйте каждую ошибку снова.

Случай 3 — Управление лимитом спереди. Задание по обогащению данных постоянно выполнялось с пределом 429. Они следовали заголовку x-ratelimit-remaining и ограничивали трафик в соответствии с квотой. Таким образом, они держали стабильный темп чуть ниже предела, не набирая ни одного 429-го; Работа была выполнена более предсказуемо и быстрее.

Распространенные ошибки

  • Увеличение скорости в 429: ухудшает ситуацию; Переключитесь на отступление.
  • Повторная попытка каждой ошибки: 400/401/404 является постоянной; Повторная попытка — пустая трата времени.
  • Использование фиксированного ожидания: создает коллизию; Используйте экспоненту + джиттер.
  • Игнорирование «повторной попытки после»: наиболее точно соблюдать время, указанное провайдером.
  • Раскрытие пользователю грубой ошибки: подрывает доверие, создает уязвимости; Классифицируйте внутри.
  • Неограниченное количество повторов: установите верхний предел (например, 5 повторов); тогда сдавайся изящно.

Глубже: организация очередей, параллелизм и автоматические выключатели

Выдерживание одного-единственного желания — это первый шаг; Настоящая зрелость заключается в том, чтобы управлять большим количеством запросов, не выходя за пределы. Здесь вступают в силу три концепции.

Очередь. Вы помещаете запросы в очередь, чтобы отправлять их с контролируемой скоростью, а не немедленно. Организация очереди сглаживает внезапные всплески трафика: даже если одновременно поступит 1000 запросов, очередь будет освобождать их со скоростью ниже установленного предела. Таким образом вы предотвратите ошибку 429 и вам не придется беспокоиться об ее исправлении.

Ограничение параллелизма: вы ограничиваете количество запросов, находящихся «в воздухе» одновременно. Неограниченные параллельные запросы быстро заполняют ограничения RPM и TPM. Разумный потолок параллелизма (например, не более 10 одновременных запросов) сохраняет ограничения и делает систему предсказуемой.

Размыкатель цепи: если провайдер продолжает возвращать 500/529, вместо того, чтобы упорно пробовать каждый запрос, вы на некоторое время «разрываете цепь» и быстро отклоняете запрос, даже не отправив его. После ожидания вы снова включаете цепь и пробуете. Этот шаблон предотвращает сбой вашей системы в случае временного сбоя провайдера.

Вместе эти три обеспечивают отказоустойчивость на уровне системы, выходящую за рамки логики повтора одного вызова. В небольших масштабах автоматической повторной попытки SDK достаточно; По мере роста масштаба организации очередей, параллелизм и автоматический выключатель становятся незаменимыми. У них у всех одна общая цель: отразить пользователю временную проблему не как сбой, а как невидимую задержку в несколько секунд.

В заключение

429 возвращается при превышении ограничений скорости (RPM/ITPM/OTPM); Это временная ошибка, и будет повторена попытка с использованием повторной попытки и экспоненциальной задержки + джиттера. 500 и 529 также являются предварительными; 400/401/403/404 — это проблема запроса/идентификации, которую нельзя решить повторной попыткой. Надежный поток разделяет ошибки на эти две группы, выполняет ограниченное количество попыток, отслеживает лимит спереди и показывает пользователю спокойные сообщения.

Задача приложения

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

контрольный список

  • [ ] Я могу объяснить ограничения RPM/ITPM/OTPM и 429.
  • [ ] Я могу применить логику экспоненциального отступления + дрожания + повторной попытки.
  • [ ] Я могу классифицировать коды ошибок как повторяемые/постоянные.
  • [ ] Я знаю, что нам не следует повторять каждую ошибку.
  • [ ] Вместо грубой ошибки я могу показать пользователю спокойное, ориентированное на действие сообщение.