Rate limiting и backpressure
↑ 7.3 Надёжность и отказоустойчивость · ← Предыдущая
Зачем это на собесе
Как защитить систему от перегрузки: ограничить вход и не дать очередям расти бесконечно.
Объяснение
Rate limiting ограничивает скорость входящих (или исходящих) запросов. Backpressure — механизм, когда перегруженный потребитель замедляет производителя.
| Алгоритм | Суть |
|---|---|
| Fixed window | N запросов в окне; всплеск на границе окон |
| Sliding window | плавное окно, точнее |
| Token bucket | токены пополняются с постоянной скоростью; допускает всплески |
| Leaky bucket | постоянная скорость обработки, лишнее отбрасывается/ждёт |
| Concurrency limit | максимум одновременных запросов |
Реализация в .NET — встроенный RateLimiter (см. CORS, rate limiting, сжатие ответов); для кластера — общий счётчик в Redis (INCR с TTL, Lua-скрипт) или лимиты на API Gateway.
Ограничения бывают: по IP, пользователю/ключу, тарифному плану, эндпоинту (логин строже).
Ответ при превышении: 429 Too Many Requests + Retry-After + RateLimit-* заголовки.
Backpressure
| Механизм | Где |
|---|---|
Bounded-очередь (Channel с BoundedChannelFullMode.Wait) | внутри процесса |
Prefetch/max.poll.records | брокеры сообщений |
| TCP/HTTP2 flow control | сеть |
| Load shedding (быстрый отказ) | при перегрузке |
| Reactive Streams | стриминг |
| Autoscaling | вертикально/горизонтально по метрикам очереди |
Нюансы и подводные камни
- Неограниченные очереди скрывают перегрузку до OOM и огромной задержки.
- Лимиты без клиентской стороны (ретраи с backoff) приводят к штормам повторов.
- Лимит по IP за NAT/прокси бьёт по многим пользователям: используйте идентификатор клиента.
- Distribution: локальные лимиты умножаются на число реплик.
- Приоритеты: критичный трафик не должен упираться в общий лимит.
Практика
- Реализуйте token bucket в Redis и проверьте под нагрузкой.
- Замените unbounded-очередь на bounded
Channelи измерьте поведение. - Добавьте
Retry-Afterи клиентский backoff.
Вопросы с ответами
Token bucket или fixed window?
Token bucket сглаживает нагрузку и допускает контролируемые всплески; fixed window проще, но имеет пики на границах.
Что такое backpressure?
Способ дать понять источнику, что нужно замедлиться, чтобы очереди не росли бесконтрольно.