Rate Limiting en Kotlin: bibliotecas y ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Rate Limiting en Kotlin: guía completa de herramientas y bibliotecas



Rate limiting (limitación de velocidad de solicitudes) es un mecanismo críticamente importante para proteger servicios web, APIs y microservicios de sobrecargas, ataques DDoS y consumo descontrolado de recursos. En el ecosistema de Kotlin existen varias bibliotecas potentes y herramientas integradas para implementar throttling. En este artículo analizaremos en detalle las mejores prácticas, las bibliotecas populares y ejemplos de código en Kotlin.



¿Por qué es necesario el Rate Limiting?

Sin limitaciones, un cliente o atacante puede enviar miles de solicitudes por segundo, lo que provocará:

  • Degradación del rendimiento para todos los usuarios
  • Sobrecarga de la base de datos y APIs externas
  • Aumento de costos en infraestructura en la nube
  • Incumplimiento del SLA (Acuerdo de Nivel de Servicio)


Algoritmos principales de Rate Limiting

Antes de elegir una biblioteca, es importante comprender los algoritmos básicos:

  • Token Bucket (Cubo de fichas) — el algoritmo más popular. Las fichas se agregan a una velocidad constante, cada solicitud consume una ficha. Si se agotan las fichas, la solicitud es rechazada.
  • Leaky Bucket (Cubo con fugas) — las solicitudes se colocan en una cola de tamaño fijo y se procesan a una velocidad constante. Las solicitudes excedentes se descartan.
  • Sliding Window (Ventana deslizante) — considera las solicitudes del último intervalo de tiempo (por ejemplo, 60 segundos). Es más preciso que la ventana fija.
  • Fixed Window (Ventana fija) — el algoritmo más simple: el límite se restablece cada N segundos. Es vulnerable a picos en los bordes de la ventana.


Principales bibliotecas para Rate Limiting en Kotlin



1. Resilience4j — RateLimiter

Resilience4j es una biblioteca ligera para garantizar la tolerancia a fallos, inspirada en Netflix Hystrix. Proporciona el módulo RateLimiter, ideal para aplicaciones Kotlin gracias a su total compatibilidad con corrutinas y su estilo funcional.



Instalación (Gradle):

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


Ejemplo de uso con corrutinas:

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

// Creamos la configuración: 10 solicitudes 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 { // Su solicitud a la API delay(100) "Respuesta de la API" }}


Ventajas:

  • Soporte nativo para corrutinas de Kotlin
  • Configuración flexible de tiempos de espera y límites
  • Monitoreo a través de Micrometer, Prometheus
  • Funciona con Spring Boot, Ktor, Vert.x


2. Bucket4j — Token Bucket avanzado

Bucket4j es una biblioteca que implementa el algoritmo Token Bucket con soporte para sistemas distribuidos (a través de Redis, Hazelcast, Infinispan). Es ideal para microservicios de alta carga en Kotlin.



Instalación:

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


Ejemplo de uso básico:

import io                    

Recommendations