Rate Limiting em Kotlin: bibliotecas, estratégias e exemplos práticos
\n\nRate 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\n1. Bucket4j — implementação avançada de Token Bucket
\n\nBucket4j é 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\nPrincipais 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
Exemplo de um rate limiter simples em Kotlin:
\nimport 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\nPara um cenário distribuído (por exemplo, várias instâncias de um microsserviço), use Bucket4j com Redis:
\nimport 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\n2. Resilience4j — RateLimiter como parte do Circuit Breaker
\n\nResilience4j é 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).
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
Exemplo com corrotinas:
\nimport 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 Também na biblioteca
Trabalhando com arquivos ZIP em Node.js: guia completo
msw para TypeScript: guia completo com exemplos práticos
Criptografia em C++: guia completo para criptografia e hash
Processamento JSON em Java: bibliotecas Jackson e Gson para manipulação de dados