Код Middle Безопасность бэкенда спрашивают часто обновлено
Rate limiter на token bucket
Условие
Реализуй class TokenBucket для ограничения частоты запросов по ключу (IP, пользователь, API-ключ):
new TokenBucket({ capacity, refillPerSec, now = () => Date.now() }): ведро вмещаетcapacityтокенов, пополняется со скоростьюrefillPerSecтокенов в секунду (непрерывно, дробно), новый ключ стартует с полным ведром;take(key, cost = 1): если токенов хватает, списываетcostи возвращает{ allowed: true, remaining }, гдеremainingцелая часть остатка (Math.floor); иначе ничего не списывает и возвращает{ allowed: false, retryAfterMs }: через сколько мс токенов станет достаточно (Math.ceil).
Состояние ключа: число токенов и время последнего пересчёта. Пересчитывать лениво при обращении, без таймеров.
Что проверяют тесты
всплеск до capacity, потом отказ
пополнение со временем
не больше capacity после простоя
ключи независимы
отказ не списывает токены
дробное пополнение
Как подойти
Подсказки: 2
- При каждом
takeдосчитай токены:+ прошедшие секунды × скорость, но не вышеcapacity. - Время ожидания: недостающие токены делить на скорость.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
deepMerge без prototype pollution
Следующий вопрос
Кто превысил лимит запросов: скользящее окно