Алгоритмы rate limiting: token bucket, leaky bucket, sliding window. Burst-friendly vs smooth output vs precise.
Rate limiting — защита от перегрузки и злоупотреблений. Принцип: ограничить число запросов от одного источника (IP, user_id, API key) за единицу времени. Главный вопрос: какой алгоритм — burst-friendly или smooth.
Три фундаментальных алгоритма (наиболее частые в проде):
Token bucket — бакет вместимостью N токенов, пополняется со скоростью R/sec. Каждый запрос берёт 1 токен. Пустой бакет → 429. Допускает burst до capacity. Самый частый выбор для API rate limiting (AWS API Gateway, Stripe, GitHub).
Leaky bucket — буферизует burst и выпускает с постоянной скоростью. Используется когда важна гладкость output rate (traffic shaping в сетях, защита downstream от burst). При полном бакете — drop.
Sliding window counter — точный подсчёт запросов в скользящем окне (например, последние 60 секунд). Решает проблему «boundary spike» fixed window (двойная нагрузка на границе минуты). Реализация: Redis sorted set с timestamp'ами + ZREMRANGEBYSCORE.
Retry-After. Хороший клиент будет повторять с backoff.