Rate limiting и backpressure
Система должна уметь сказать «слишком много» — и клиенту, и самой себе.
Rate limiting — ограничение числа запросов от клиента за интервал времени. Backpressure — механизм, которым перегруженный потребитель сигналит источнику замедлиться.
Зачем ограничивать частоту
- Защита от перегрузки. Один клиент не должен положить сервис шквалом запросов.
- Защита от злоупотреблений. Перебор паролей, парсинг, DDoS.
- Справедливость. Никто не съедает ресурс в ущерб остальным.
- Контроль расходов. Лимиты на платных API.
Превысившему лимиту обычно возвращают HTTP 429 Too Many Requests с заголовком Retry-After.
Алгоритмы rate limiting
| Алгоритм | Идея | Особенность |
| Token bucket | токены капают с фиксированной скоростью, запрос тратит токен | разрешает короткие всплески — самый популярный |
| Leaky bucket | запросы вытекают из ведра с постоянной скоростью | сглаживает поток, всплески режет |
| Fixed window | N запросов за фиксированное окно (минуту) | прост, но всплеск на границе окон |
| 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 управляет нагрузкой внутри: сигнал источнику замедлиться, лимит буфера, сброс или деградация.
- Управляемый отказ части запросов лучше неуправляемого обрушения всей системы.