Rate limiting и backpressure

Система должна уметь сказать «слишком много» — и клиенту, и самой себе.

Rate limiting — ограничение числа запросов от клиента за интервал времени. Backpressure — механизм, которым перегруженный потребитель сигналит источнику замедлиться.

Зачем ограничивать частоту

  • Защита от перегрузки. Один клиент не должен положить сервис шквалом запросов.
  • Защита от злоупотреблений. Перебор паролей, парсинг, DDoS.
  • Справедливость. Никто не съедает ресурс в ущерб остальным.
  • Контроль расходов. Лимиты на платных API.

Превысившему лимиту обычно возвращают HTTP 429 Too Many Requests с заголовком Retry-After.

Алгоритмы rate limiting

АлгоритмИдеяОсобенность
Token bucketтокены капают с фиксированной скоростью, запрос тратит токенразрешает короткие всплески — самый популярный
Leaky bucketзапросы вытекают из ведра с постоянной скоростьюсглаживает поток, всплески режет
Fixed windowN запросов за фиксированное окно (минуту)прост, но всплеск на границе окон
Sliding windowскользящее окноточнее, но дороже считать

Token bucket подробнее

Представьте ведро ёмкостью 10 токенов. Токены добавляются по 1 в секунду. Каждый запрос забирает токен; нет токенов — запрос отклоняется (429). Ведро позволяет накопить запас и пережить короткий всплеск (до 10 запросов разом), но в среднем держит скорость 1/с. Этот баланс «средняя скорость + допустимый всплеск» и делает token bucket стандартом.

Ёмкость = 10, пополнение = 1 токен/с

старт:  [##########] 10 токенов
всплеск 8 запросов → [##......]  2 токена (все прошли)
ещё 5 запросов сразу → 2 прошли, 3 отклонены (429)
пауза 5 с → ведро снова накапливает токены

Backpressure

Rate limiting защищает вход в систему. Backpressure управляет нагрузкой внутри. Если consumer не успевает разгребать очередь, она растёт — и в какой-то момент кончится память. Backpressure — это сигнал «притормози» вверх по потоку: producer должен замедлиться или приостановиться.

Стратегия при перегрузкеЧто делает
Замедлить producerисточник шлёт медленнее, пока consumer не догонит
Буфер с лимитомочередь ограничена; полна — отклоняем новое
Сбрасывать (load shedding)отбрасываем часть запросов, чтобы выжить
Деградироватьотдаём упрощённый ответ под нагрузкой

Без backpressure перегруженная система не замедляется, а обрушивается: очереди разрастаются, память кончается, падает всё. Управляемый отказ части запросов лучше неуправляемого падения целиком.

Итог

  • Rate limiting ограничивает вход (429 при превышении); token bucket популярен, так как держит среднюю скорость и допускает всплески.
  • Backpressure управляет нагрузкой внутри: сигнал источнику замедлиться, лимит буфера, сброс или деградация.
  • Управляемый отказ части запросов лучше неуправляемого обрушения всей системы.
Проверьте себя
1. Какой HTTP-статус обычно возвращают при превышении лимита запросов?
A404 Not Found
B429 Too Many Requests
C500 Internal Server Error
D200 OK
2. Чем алгоритм token bucket удобен по сравнению с fixed window?
AОн вообще не пропускает запросы
BОн держит среднюю скорость, но разрешает короткие всплески за счёт накопленных токенов
CОн не требует считать запросы
DОн медленнее работает
3. Что такое backpressure?
AОграничение запросов на входе в систему
BСигнал перегруженного потребителя источнику замедлиться, чтобы очередь не разрослась
CАлгоритм кэширования
DСпособ репликации данных
4. Почему без backpressure перегруженная система опасна?
AОна просто замедляется и всё
BОчереди и буферы неограниченно растут, кончается память, и система обрушивается целиком
CОна начинает кэшировать всё подряд
DНичего страшного не происходит
Поддержать проект