Ошибка 429 Too Many Requests возникает при превышении лимита запросов к API за единицу времени. Исправьте её, добавив задержки между запросами, реализовав exponential backoff и кэширование данных.
Причины проблемы
- Отсутствие паузы между последовательными HTTP-запросами к API
- Превышение rate limit, установленного сервером
- Одновременные запросы от нескольких потоков без синхронизации
- Кэш отключен, приложение повторно запрашивает одни данные
- Игнорирование заголовков
X-RateLimit-RemainingиRetry-After - Использование невалидного или истёкшего API-ключа
Пошаговая инструкция
- Откройте файл с кодом, который отправляет запросы к API, в вашем редакторе.
- Найдите функцию, выполняющую HTTP-запросы.
- Добавьте переменную
import time(Python) или аналог в вашем языке. - Установите минимальный интервал:
MIN_INTERVAL = 1(1 секунда между запросами). - Перед каждым запросом вставьте
time.sleep(MIN_INTERVAL). - Оберните запрос в блок try-except для ловли ошибки 429.
- При поймании 429 прочитайте заголовок
Retry-Afterиз ответа сервера. - Реализуйте exponential backoff: первая повторная попытка через 2 сек, вторая через 4 сек, третья через 8 сек.
- Добавьте максимум 5 попыток повтора перед отказом.
- Включите кэширование результатов в памяти или БД, чтобы не повторять запросы.
- Если код многопоточный, добавьте Lock или Semaphore для синхронизации доступа к API.
- Проверьте, что ваш API-ключ действителен, в документации поставщика.
- Тестируйте изменения локально перед развёртыванием на сервер.
Часто задаваемые вопросы
Что означает 429 Too Many Requests?
Сервер ограничил частоту ваших запросов, так как вы превысили допустимое количество запросов за определённый период времени.
Как узнать лимит запросов моего API?
Посмотрите документацию поставщика API или проверьте заголовки ответа: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Сколько времени ждать перед повторным запросом?
Используйте значение из заголовка Retry-After или применяйте exponential backoff, начиная с 2 секунд и удваивая интервал при каждой новой попытке.