Skip to content

Что такое Token Bucket

Коротко:

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.

Подробности

  • Capacity: max tokens в bucket (burst size)
  • Refill rate: r tokens/sec (long-term average)
  • Per-key: один bucket per user/IP/API key
  • Storage: Redis atomic ops (INCR/DECR + EXPIRE)
  • Typical: 60 req/min = 1 token/sec refill + capacity 10 (burst)

Пример

# 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 vs sliding window?

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.

Rate limit per-IP или per-user?

Оба. per-IP защищает от anonymous abuse. per-user — от credential stuffing после login.