Ограничение скорости API: 4 алгоритма, которые должен знать каждый разработчик
Фиксированное окно, скользящее окно, сегмент токенов и дырявый контейнер, объясненные с помощью диаграмм, заголовков X-RateLimit и логики повторов Node.js, которую можно скопировать и вставить.
Ваше пакетное задание отправляет 200 запросов за 3 секунды, и каждый ответ возвращается. 429 Too Many Requests.
Ваш процессор веб-перехватчиков забивает сторонний API и блокируется на 15 минут. Интеграция клиента
замолкает, потому что их цикл повторных попыток исчерпал дневную квоту за первый час. Эти неудачи разделяют
одна основная причина: код не соблюдает ограничения скорости.
В этом руководстве рассматриваются четыре алгоритма ограничения частоты ядра, показано, как читать X-RateLimit
заголовки из любого API и дает вам возможность скопировать и вставить код Node.js для логики повтора с экспоненциальной отсрочкой.
Четыре алгоритма ограничения скорости
Каждый ограничитель скорости отвечает на один и тот же вопрос: «Должен ли этот запрос пройти или мне следует его отклонить?» Четыре алгоритма различаются тем, как они отслеживают время и обрабатывают пакеты.
1. Фиксированное окно
Самый простой подход. Разделите время на фиксированные интервалы (например, 1 минута). Подсчитайте запросы за интервал. Когда счетчик достигнет предела, отклоните все, пока не начнется следующий интервал.
Фиксированное окно легко построить: один счетчик и одна временная метка для каждого клиента. Недостаток заключается в том, пограничная проблема. Клиент может отправить полный лимит в конце одного окна и полный лимит в начале следующего, получая в два раза больше запланированной скорости за короткую очередь. Старый API GitHub ограничитель скорости использует фиксированные окна; с тех пор они перешли к более сложным подходам.
2. Раздвижное окно
Вместо сброса по фиксированным границам окно сдвигается при каждом запросе. В любой данный момент, ограничитель просматривает последние N секунд и подсчитывает запросы за этот промежуток времени.
Скользящее окно устраняет проблему разрыва границ. Цена — более высокая память: вы храните временную метку
на каждый запрос, ни одного счетчика. Редис ZRANGEBYSCORE делает это практичным в масштабе.
Cloudflare и многие шлюзы API используют скользящие окна для ограничения скорости для каждого пользователя.
3. Корзина для токенов
Представьте себе ведро с жетонами. Каждый запрос стоит один токен. Токены пополняются по фиксированной ставке. Если ведро пусто, запрос отклоняется. Если ведро заполнено, лишние токены не накапливаются.
Token Bucket — самый популярный алгоритм в производстве. Stripe, AWS API Gateway и большинство облачных сервисов провайдеры используют его варианты. Емкость корзины контролирует размер пакета, а скорость пополнения контролирует устойчивая пропускная способность. Два параметра дают вам детальный контроль над формой трафика.
4. Дырявое ведро
Обратное к ведру токенов. Запросы наполняют ведро. Ведро опорожняется с постоянной скоростью. Если корзина переполняется, лишние запросы отклоняются. Скорость вывода остается постоянной независимо от ввода всплески.
Дырявое ведро хорошо подходит для формирования трафика, когда вам нужна стабильная скорость вывода: работники очередей, доставка веб-перехватчиков и конвейеры кодирования видео. Компромисс заключается в том, что пакеты вместо этого ставятся в очередь. чем служил; Задержка увеличивается под нагрузкой.
Сравнение четырех алгоритмов
| Алгоритм | Взрыв разрешен? | Память | Общий случай использования |
|---|---|---|---|
| Фиксированное окно | Краевые всплески (2 раза на границе) | Низкий (1 счетчик) | Простые счетчики, аналитика |
| Раздвижное окно | Гладкая, без выступов по краям | Средний (временная метка каждого запроса) | Ограничения API для каждого пользователя |
| Корзина токенов | Контролируемые всплески до полной мощности | Низкий (2 значения) | Большинство производственных API (Stripe, AWS) |
| Дырявое ведро | В очереди, постоянная скорость вывода | Средний (очередь) | Формирование трафика, работники очередей |
Чтение заголовков X-RateLimit
Большинство API включают информацию об ограничении скорости в заголовки ответов. Три заголовка расскажут вам все вам нужно оставаться в пределах лимита:
X-RateLimit-Limit: максимальное количество запросов, разрешенных для каждого окнаX-RateLimit-Remaining: запросы, которые вы оставили в текущем окнеX-RateLimit-Reset: временная метка Unix (в секундах) при перезагрузке окна.
Когда вы превысите лимит, статус ответа будет 429 Too Many Requests и
Retry-After заголовок сообщает вам, сколько секунд ждать.
Попробуйте это с API Ботои. Эта команда Curl хэширует строку и печатает заголовки ограничения скорости:
Заголовки ответов:
Это говорит о том, что ограничение составляет 5 запросов на окно, у вас осталось 4 после этого запроса, и окно сбрасывается в заданную временную метку Unix. Отслеживайте эти значения в своем HTTP-клиенте, чтобы избежать попадания 429-е на первом месте.
Кончик: Конвертировать X-RateLimit-Reset до времени ожидания:
waitMs = (resetTimestamp - Math.floor(Date.now() / 1000)) * 1000
Логика повтора с экспоненциальной отсрочкой в Node.js
При появлении ошибки 429 не повторяйте попытку немедленно. Плотный цикл повторов усугубляет проблему: вы остаетесь ограничение по скорости дольше, и сервер помечает вас как оскорбительного. Вместо этого используйте экспоненциальную задержку с джиттером.
Используйте его с любой конечной точкой:
Функция проверяет наличие Retry-After заголовок сначала. Если сервер сообщает вам, как долго
ждать, уважайте это. Если заголовок не существует, происходит возврат к экспоненциальной задержке: 1 секунда, 2 секунды,
4 секунды, 8 секунд. Случайный джиттер (0-500 мс) предотвращает проблему громоподобного стада, когда сотни
клиенты повторяют попытку в тот же момент.
Проактивное регулирование: избегайте ошибок 429 до того, как они произойдут.
Реактивная повторная попытка обрабатывает сбои после их возникновения. Превентивное регулирование предотвращает их. Если ты знаешь ограничение скорости (из документов или заголовков), скорость выполнения запросов на стороне клиента.
Этот ограничитель скорости на стороне клиента отслеживает временные метки запросов в скользящем окне. Перед каждым запросом он проверяет, заполнено ли окно, и при необходимости ждет. Вы отправляете запросы максимально безопасно ставка без единого 429.
Модель ограничения скорости Ботоя
Ботой использует двухуровневую систему ограничения ставок:
| План | Пакет (в минуту) | Квота | Авторизация |
|---|---|---|---|
| Бесплатно (0 долларов США) | 5 запросов/мин | 100/день | Нет (на основе IP) |
| Стартер (9 долларов США в месяц) | 30 запросов/мин | 300 000/месяц | API-ключ |
| Про (49 долларов США в месяц) | 300 запросов/мин | 3 000 000/месяц | API-ключ |
| Бизнес ($199/мес) | 1000 запросов/мин | 30 000 000/месяц | API-ключ |
Анонимный доступ отслеживает запросы по IP-адресу. Суточный счетчик сбрасывается в полночь по всемирному координированному времени через Счетчик КВ Cloudflare. Аутентифицированные запросы используют ключ API для идентификации и ограничения. применяются посредством Унки ограничитель скорости сегмента токенов на краю.
Каждый ответ от api.botoi.com включает в себя три X-RateLimit заголовки
описано выше, поэтому ваша логика повторных попыток работает одинаково независимо от плана.
Проверенные подходы для потребителей API
- Прочитайте заголовки каждого ответа. Не устанавливайте жестко ограничения скорости из документации. API изменяют ограничения без предварительного уведомления. Заголовки — источник истины.
- Используйте экспоненциальную задержку с джиттером. Фиксированные интервалы повторных попыток вызывают синхронизацию повторные попытки между клиентами. Джиттер распределяет нагрузку.
- Пакетный пакет, в котором API это поддерживает. Один запрос с 10 элементами стоит 1 лимит ставки. жетон. Десять отдельных запросов стоят 10.
- Кэшировать ответы. Если данные не меняются между запросами, сохраните результат и пропустить вызов API. Записи DNS, сертификаты SSL и данные WHOIS редко меняются в течение нескольких минут.
- Используйте очередь для фоновой работы. Не запускайте вызовы API из горячего цикла. Нажмите работайте с очередью (BullMQ, SQS, Cloudflare Queues) и обрабатывайте элементы с контролируемой скоростью.
-
Следите за оставшейся квотой. Бревно
X-RateLimit-Remainingк твоему панель показателей. Установите оповещение, когда оно упадет ниже 20% от лимита.
Ключевые моменты
- Доминируют четыре алгоритма. Фиксированное окно является самым простым. Корзина с токенами является наиболее популярной. Скользящее окно устраняет разрывы границ. Дырявое ведро сглаживает выход.
-
Заголовки X-RateLimit — это ваш API. Читать
Limit,Remaining, иResetна каждый ответ оставаться под шапкой. -
Экспоненциальная задержка с ручкой джиттера 429 с. Скопируйте
fetchWithRetryприведенную выше функцию в вашу кодовую базу и оберните каждый внешний вызов API. - Упреждающее регулирование предотвращает появление 429-х. Скорость выполнения запросов на стороне клиента вместо того, чтобы ждать, пока сервер ответит.
- Для тестирования не требуется учетная запись. Нажмите любую конечную точку ботоя в api.botoi.com с 5 бесплатными запросами в минуту, чтобы увидеть заголовки ограничения скорости в действии.
FAQ
- Что такое ограничение скорости API и почему API его используют?
- Ограничение скорости ограничивает количество запросов, которые клиент может сделать за определенный период времени. API используют его для защиты серверов от перегрузки, предотвращения злоупотреблений, обеспечения справедливого распределения ресурсов между клиентами и обеспечения предсказуемости затрат на инфраструктуру. Без этого один клиент мог бы морить голодом всех остальных.
- Что означают заголовки X-RateLimit?
- X-RateLimit-Limit — максимальное количество запросов, разрешенных для каждого окна. X-RateLimit-Remaining — это количество, которое у вас осталось. X-RateLimit-Reset — это временная метка Unix при перезагрузке окна. Параметр «Повторить после» (при 429 ответах) сообщает вам, сколько секунд нужно подождать перед повторной попыткой.
- Как мне обрабатывать ответ 429 Too Many Requests?
- Прочтите заголовок Retry-After и подождите столько секунд. Если заголовок Retry-After не существует, используйте экспоненциальную отсрочку: подождите 1 секунду после первого 429, 2 секунды после второго, 4 секунды после третьего и так далее. Добавьте случайный джиттер (0–500 мс), чтобы предотвратить проблемы с громоподобным стадом, когда множество клиентов повторяют попытки одновременно.
- Какой алгоритм ограничения скорости является наиболее распространенным?
- Корзина токенов является наиболее распространенным в рабочих API. Stripe, AWS и большинство облачных провайдеров используют его варианты. Корзина токенов позволяет контролировать всплески, обеспечивая при этом устойчивую скорость, которая лучше соответствует реальным моделям трафика, чем фиксированные окна.
- Ограничивает ли ставка ботои анонимные запросы?
- Да. Анонимные запросы (без ключа API) получают 5 запросов в минуту и 100 запросов в день, отслеживаемые по IP-адресу. Аутентифицированные запросы на платных планах имеют более высокие лимиты: Starter — 30 в минуту, Pro — 300 в минуту, а Business — 1000 в минуту.
Начните разработку с botoi
150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.