Перейти к содержимому
5 / 15

Как устроено ограничение скорости: token bucket, leaky bucket и скользящее окно?

Все алгоритмы отвечают на один вопрос — сколько запросов пропустить за интервал, — но по-разному ведут себя на всплесках. Фиксированное окно проще всего и допускает двойной всплеск на стыке окон. Скользящее окно честнее, но требует хранить историю или аппроксимировать её по двум соседним окнам. Token bucket копит токены с постоянной скоростью и разрешает всплеск размером с ведро — обычно это то, что нужно API. Leaky bucket выпускает запросы ровным темпом, сглаживая пики за счёт очереди. В распределённой системе счётчик держат в общем хранилище, чаще всего в Redis, и меняют атомарно, иначе фактический лимит умножится на число инстансов. Отказ отдают кодом 429 с заголовком Retry-After.

Как устроено ограничение скорости: token bucket, leaky bucket и скользящее окно? | JScriptiser