Leaky Bucket
Запросы копятся в очереди, обрабатываются строго равномерно.
1class LeakyBucket {2 private queue: number[] = []3 4 constructor(private capacity: number, private outRateMs: number) {}5 6 /** принимает запрос в момент at, возвращает моменты обработок */7 accept(at: number, processedAt: number[]): 'queued' | 'dropped' {8 if (this.queue.length >= this.capacity) return 'dropped'9 this.queue.push(at)10 processedAt.push(at)11 return 'queued'12 }13 14 /** дырка: обработка строго каждые outRateMs */15 leak(nowMs: number): number {16 return Math.ceil(nowMs / this.outRateMs) * this.outRateMs17 }18}Проблема
Запросы копятся в очереди, обрабатываются строго равномерно.
Что вы видите
Дырка в ведре тикает по расписанию: выход гладкий, что бы ни лилось внутрь.
Как это работает
Выравнивает темп (сглаживание трафика), переполнение — сброс. Token bucket прощает всплеск, leaky — гарантирует ровный выход.
Пошаговый разбор
- 01
Очередь
Входящие ждут в ведре.
- 02
Дырка
Обработка каждые T мс.
- 03
Сброс
Ведро полно — запрос потерян.
Complexity и ограничения
См. complexity в шапке страницы.
Edge cases
- Пустой вход
Корректно завершается без лишних шагов.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Продукт
Классический приём в реальных системах.
Собеседования
Стандартный вопрос на понимание структуры.
Связанные алгоритмы
«Ровный выход при рваном входе»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.