Sobes.tech
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 для централизованного контроля.