Rate Limiting em Kotlin: bibliotecas e exemplos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Rate Limiting em Kotlin: guia completo sobre ferramentas e bibliotecas



Rate limiting (limitação de taxa de requisições) é um mecanismo criticamente importante para proteger serviços web, APIs e microsserviços contra sobrecargas, ataques DDoS e consumo descontrolado de recursos. No ecossistema Kotlin, existem várias bibliotecas poderosas e ferramentas integradas para implementar throttling. Neste artigo, analisaremos detalhadamente as melhores práticas, bibliotecas populares e exemplos de código em Kotlin.



Por que o Rate Limiting é necessário?

Sem limitações, um cliente ou invasor pode enviar milhares de requisições por segundo, o que pode levar a:

  • Degradação de desempenho para todos os usuários
  • Sobrecarga do banco de dados e APIs externas
  • Aumento dos custos com infraestrutura em nuvem
  • Violação do SLA (Service Level Agreement)


Principais algoritmos de Rate Limiting

Antes de escolher uma biblioteca, é importante entender os algoritmos básicos:

  • Token Bucket (Balde de Tokens) — o algoritmo mais popular. Tokens são adicionados a uma taxa constante, cada requisição consome um token. Se os tokens acabarem, a requisição é rejeitada.
  • Leaky Bucket (Balde Furado) — as requisições são colocadas em uma fila de tamanho fixo e processadas a uma taxa constante. Requisições excedentes são descartadas.
  • Sliding Window (Janela Deslizante) — considera as requisições do último intervalo de tempo (por exemplo, 60 segundos). Mais preciso que a janela fixa.
  • Fixed Window (Janela Fixa) — o algoritmo mais simples: o limite é redefinido a cada N segundos. Vulnerável a picos nos limites da janela.


Principais bibliotecas para Rate Limiting em Kotlin



1. Resilience4j — RateLimiter

Resilience4j é uma biblioteca leve para garantir tolerância a falhas, inspirada no Netflix Hystrix. Ela fornece o módulo RateLimiter, que é ideal para aplicações Kotlin devido à total compatibilidade com corrotinas e estilo funcional.



Instalação (Gradle):

implementation("io.github.resilience4j:resilience4j-kotlin:2.2.0")implementation("io.github.resilience4j:resilience4j-ratelimiter:2.2.0")


Exemplo de uso com corrotinas:

import io.github.resilience4j.ratelimiter.RateLimiterimport io.github.resilience4j.ratelimiter.RateLimiterConfigimport io.github.resilience4j.kotlin.ratelimiter.executeSuspendFunctionimport kotlinx.coroutines.delayimport java.time.Duration

// Criando configuração: 10 requisições por segundoval config = RateLimiterConfig.custom() .limitForPeriod(10) .limitRefreshPeriod(Duration.ofSeconds(1)) .timeoutDuration(Duration.ofMillis(500)) .build()

val rateLimiter = RateLimiter.of("my-api-limiter", config)

suspend fun limitedApiCall(): String { return rateLimiter.executeSuspendFunction { // Sua requisição à API delay(100) "Resposta da API" }}


Vantagens:

  • Suporte nativo a corrotinas Kotlin
  • Configuração flexível de timeouts e limites
  • Monitoramento via Micrometer, Prometheus
  • Funciona com Spring Boot, Ktor, Vert.x


2. Bucket4j — Token Bucket avançado

Bucket4j é uma biblioteca que implementa o algoritmo Token Bucket com suporte a sistemas distribuídos (via Redis, Hazelcast, Infinispan). Ideal para microsserviços Kotlin de alta carga.



Instalação:

implementation("com.github.vladimir-bukhtoyarov:bucket4j-core:8.7.0")implementation("com.github.vladimir-bukhtoyarov:bucket4j-redis:8.7.0") // para modo distribuído


Exemplo de uso básico:

import io                    

Recommendations