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.
# 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
endToken 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.