Back to questions
СБЕР
Senior
3
Как контролировать нагрузку на ручки (rate limiting)?
Companies where asked
Answer from AI
sobes.tech AI
Для контроля нагрузки на API-ручки (rate limiting) применяют различные подходы, чтобы ограничить количество запросов от одного клиента за определённый промежуток времени. Это помогает защитить сервис от перегрузок и злоупотреблений.
Основные методы:
- Token Bucket — клиенту выдаётся определённое количество токенов, каждый запрос «тратит» токен. Токены восстанавливаются со временем.
- Leaky Bucket — запросы обрабатываются с фиксированной скоростью, излишек откладывается в очередь или отбрасывается.
- Fixed Window — считаются запросы за фиксированный интервал (например, за минуту).
- Sliding Window — более точный подсчёт запросов за скользящее окно времени.
В Kotlin можно реализовать rate limiting с помощью библиотек, например, resilience4j или bucket4j. Пример с bucket4j:
import io.github.bucket4j.Bandwidth
import io.github.bucket4j.Bucket
import io.github.bucket4j.Refill
import java.time.Duration
val limit = Bandwidth.classic(10, Refill.greedy(10, Duration.ofMinutes(1)))
val bucket = Bucket.builder().addLimit(limit).build()
fun handleRequest() {
if (bucket.tryConsume(1)) {
// Обработка запроса
} else {
// Возврат ошибки 429 Too Many Requests
}
}
Также можно использовать прокси-серверы (Nginx, Envoy) или API Gateway с встроенным rate limiting для централизованного контроля.