Token Bucket
Токены капают равномерно; запрос тратит токен; пусто — отказ.
1class TokenBucket {2 private tokens: number3 private last = 04 5 constructor(private capacity: number, private ratePerSec: number) {6 this.tokens = capacity7 }8 9 tryConsume(nowMs: number): boolean {10 const elapsed = (nowMs - this.last) / 100011 this.last = nowMs12 this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.ratePerSec)13 14 if (this.tokens >= 1) {15 this.tokens -= 116 return true17 }18 return false19 }20}Проблема
Токены капают равномерно; запрос тратит токен; пусто — отказ.
Что вы видите
Таймлайн: зелёные OK против красных 429; уровень ведра — лейбл.
Как это работает
Позволяет короткие всплески (полное ведро), удерживая средний темп rate. Гибче throttle; стандарт rate limiting в API-шлюзах.
Пошаговый разбор
- 01
Пополнение
rate токенов в секунду.
- 02
Расход
Запрос = 1 токен.
- 03
Отказ
Пусто — 429.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Почему API отвечает 429: token bucket»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.