Token Bucket — алгоритм rate limiting, где "bucket" заполняется token-ами с постоянной скоростью (r tokens/sec). Каждый запрос потребляет 1 token. Если bucket пуст → reject. Если полон → не добавляются новые tokens. Позволяет burst (до capacity bucket) поверх average rate. Альтернативы: leaky bucket (no burst), sliding window (precise но дорого), fixed window (edge effects).
Ниже: подробности, пример, смежные термины, FAQ.
Бесплатный онлайн-инструмент — проверка HTTP-заголовков: результат мгновенно, без регистрации.
# Redis Lua pseudocode
local tokens = redis.call("GET", key) or capacity
tokens = min(capacity, tokens + (now - last_refill) * rate)
if tokens >= 1 then
redis.call("SET", key, tokens - 1)
return allow
else
return deny
endАлгоритм Token Bucket — это метод ограничения скорости (rate limiting), который позволяет контролировать количество запросов, отправляемых на сервер, с помощью токенов, хранящихся в «ведре». Каждый токен соответствует одному запросу, и когда ведро заполняется, новые токены могут быть добавлены с заданной скоростью. Это позволяет гибко управлять трафиком и защищать сервер от перегрузки. Например, типичная настройка может включать ведро на 10 токенов, где токены добавляются со скоростью 1 токен в секунду.
Алгоритм Token Bucket работает по следующему принципу: у вас есть ведро фиксированного объема, в которое могут помещаться токены. Каждый раз, когда происходит запрос, сервер проверяет, есть ли доступные токены. Если токены доступны, один из них «извлекается» из ведра, и запрос обрабатывается. Если ведро пустое, запрос отклоняется или ставится в очередь, в зависимости от конфигурации.
Токены добавляются в ведро с определенной скоростью, что позволяет контролировать максимальное количество запросов в секунду. Например, если ведро имеет максимальный объем 10 токенов и скорость добавления 1 токен в секунду, то в течение 10 секунд может быть обработано до 10 запросов, после чего сервер будет ограничивать доступ до тех пор, пока не добавится новый токен.
Рассмотрим, как можно настроить алгоритм Token Bucket в приложении на Node.js с использованием библиотеки rate-limiter-flexible. Вот пример кода:
const { RateLimiterBuilder } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterBuilder()
.setTokensPerInterval(10, 'second')
.setBlockDuration(60) // Блокировка на 60 секунд
.build();
app.use(async (req, res, next) => {
try {
await rateLimiter.consume(req.ip);
next();
} catch (rejRes) {
res.status(429).send('Слишком много запросов, попробуйте позже');
}
});В этом примере мы создаем лимитер, который позволяет 10 запросов в секунду с блокировкой на 60 секунд для IP-адресов, превышающих лимит. Такой подход помогает защитить сервер от DDoS-атак и обеспечивает стабильную работу приложения.
Алгоритм Token Bucket имеет несколько преимуществ, которые делают его популярным выбором для реализации ограничения скорости. Во-первых, он позволяет гибко управлять трафиком, позволяя пользователям делать временные всплески запросов, что особенно полезно для приложений с переменной нагрузкой. Во-вторых, алгоритм легко реализуется и адаптируется под различные сценарии использования.
Для оптимизации работы алгоритма Token Bucket важно внимательно подойти к выбору значений для объема ведра и скорости добавления токенов. Например, для веб-приложений с высокой нагрузкой может потребоваться увеличить объем ведра, чтобы обрабатывать больший поток запросов в короткие временные промежутки.
Token bucket: простой O(1), допускает burst. Sliding window: precise count в any time window, но O(log n) или overhead Redis sorted set.
Average rate (r) — ваш target RPS. Capacity — typical burst (10-30 sec worth). E.g. 10 req/sec average + 300 capacity = 30 sec burst.
Оба. per-IP защищает от anonymous abuse. per-user — от credential stuffing после login.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.