Rate Limiting em Kotlin: bibliotecas e implementação

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: bibliotecas, estratégias e exemplos práticos

\n\n

Rate limiting (limitação de velocidade de requisições) é um mecanismo criticamente importante para proteger APIs, microsserviços e aplicações web contra carga excessiva, ataques DDoS e picos aleatórios de tráfego. No ecossistema Kotlin, que roda sobre a JVM, existem várias bibliotecas maduras que permitem implementar essa lógica de forma flexível. Neste artigo, vamos analisar três abordagens e ferramentas principais: Bucket4j, Resilience4j e o RateLimiter embutido do Guava.

\n\n

1. Bucket4j — implementação avançada de Token Bucket

\n\n

Bucket4j é uma biblioteca Java, perfeitamente compatível com Kotlin. Ela implementa o algoritmo Token Bucket (balde de tokens) e suporta limitação tanto local quanto distribuída (via Redis, Hazelcast, Infinispan).

\n\n

Principais recursos:

\n
    \n
  • Configuração da quantidade de tokens e da taxa de reabastecimento.
  • \n
  • Suporte a "bursts" (picos de curta duração) através do acúmulo de tokens.
  • \n
  • Operação em ambiente multithread sem bloqueios.
  • \n
  • Integração com Spring Boot via starter bucket4j-spring-boot-starter.
  • \n
\n\n

Exemplo de um rate limiter simples em Kotlin:

\n
import io.github.bucket4j.Bandwidth\nimport io.github.bucket4j.Bucket\nimport io.github.bucket4j.Refill\nimport java.time.Duration\n\nfun main() {\n    // 10 requisições por minuto, com capacidade de acumular até 20 tokens\n    val limit = Bandwidth.classic(20, Refill.greedy(10, Duration.ofMinutes(1)))\n    val bucket = Bucket.builder()\n        .addLimit(limit)\n        .build()\n\n    // Verifica a disponibilidade de um token\n    if (bucket.tryConsume(1)) {\n        println("✅ Requisição permitida")\n    } else {\n        println("❌ Limite excedido, tente novamente mais tarde")\n    }\n}
\n\n

Para um cenário distribuído (por exemplo, várias instâncias de um microsserviço), use Bucket4j com Redis:

\n
import io.github.bucket4j.distributed.proxy.ProxyManager\nimport io.github.bucket4j.redis.lettuce.Bucket4jLettuce\nimport io.lettuce.core.RedisClient\n\nval redisClient = RedisClient.create("redis://localhost:6379")\nval proxyManager: ProxyManager<String> = Bucket4jLettuce\n    .builder(redisClient)\n    .build()\n\nval bucket = proxyManager.builder()\n    .build("user:123", Bucket4jConfiguration(\n        Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(1)))\n    ))\n
\n\n

2. Resilience4j — RateLimiter como parte do Circuit Breaker

\n\n

Resilience4j é uma biblioteca de resiliência popular para Java/Kotlin, que inclui não apenas um rate limiter, mas também circuit breaker, retry, bulkhead. Seu módulo RateLimiter funciona com base no algoritmo Sliding Window (janela deslizante).

\n\n

Características:

\n
    \n
  • Integração fácil com corrotinas Kotlin através de funções suspend.
  • \n
  • Configuração do período da janela e do limite de requisições.
  • \n
  • Tratamento flexível de falhas: retorno de exceção, fallback ou espera.
  • \n
\n\n

Exemplo com corrotinas:

\n
import io.github.resilience4j.ratelimiter.RateLimiter\nimport io.github.resilience4j.ratelimiter.RateLimiterConfig\nimport io.github.resilience4j.kotlin.ratelimiter.awaitRateLimiter\nimport java.time.Duration\nimport kotlinx.coroutines.runBlocking\n\nval config = RateLimiterConfig.custom()\n    .limitForPeriod(10)           // 10 requisições\n    .limitRefreshPeriod(Duration.ofSeconds(1)) // em 1 segundo\n    .timeoutDuration(Duration.ofMillis(500))   // timeout de espera\n    .build()\n\nval rateLimiter = RateLimiter.of("api-limiter", config)\n\nsuspend fun fetchData(): String {\n    return awaitRateLimiter(rateLimiter) {\n        // Sua chamada de API\n        "Dados obtidos"\n    }\n}\n\nfun main() = runBlocking {\n    val result = fetchData()\n    p                    

Recommendations