Limitación de Tasa en Java: bibliotecas, algoritmos e implementación

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

Limitación de Tasa en Java: de la teoría a la implementación práctica



La Limitación de Tasa (Rate Limiting) es uno de los mecanismos clave para la protección y gestión de la carga en los sistemas distribuidos modernos. En Java, este problema se resuelve tanto a nivel de herramientas integradas como con la ayuda de bibliotecas especializadas. En este artículo, analizaremos los algoritmos principales, las bibliotecas populares y proporcionaremos ejemplos de código funcionales.



¿Por qué es necesaria la Limitación de Tasa?

La Limitación de Tasa permite:

  • Proteger la API contra abusos (DDoS, fuerza bruta de contraseñas)
  • Distribuir uniformemente la carga en el backend
  • Cumplir con los acuerdos de nivel de servicio (SLA)
  • Prevenir la superación de cuotas de servicios externos


Algoritmos principales de Limitación de Tasa

Antes de elegir una biblioteca, es importante comprender los algoritmos subyacentes:



1. Token Bucket (Bucket4j, Guava)

Algoritmo clásico. Se añaden tokens a un "cubo" a una velocidad determinada. Cada solicitud toma uno o varios tokens. Si no hay tokens, la solicitud es rechazada.

// Ejemplo en pseudocódigoclass TokenBucket {    private int tokens;    private long lastRefillTime;    private final int capacity;    private final double refillRate; // tokens por segundo

synchronized boolean tryConsume() { refill(); if (tokens > 0) { tokens--; return true; } return false; }}


2. Sliding Window Log

Almacena las marcas de tiempo de las últimas solicitudes. Con cada nueva solicitud, elimina las marcas más antiguas que la ventana y verifica si no se ha superado el límite. Es preciso, pero requiere memoria para almacenar las marcas.



3. Fixed Window Counter

Un contador simple para un intervalo fijo (por ejemplo, 100 solicitudes por minuto). Se reinicia cada minuto. Es vulnerable a cargas "pico" en los límites de la ventana.



Bibliotecas Java populares para Limitación de Tasa



1. Bucket4j

Bucket4j es una biblioteca madura que implementa completamente el algoritmo Token Bucket. Soporta escenarios distribuidos a través de Redis, Hazelcast, JCache. Tiene una API para Java 8+.

Instalación (Maven):

<dependency>    <groupId>com.github.vladimir-bukhtoyarov</groupId>    <artifactId>bucket4j-core</artifactId>    <version>8.7.0</version></dependency>

Ejemplo de uso:

import io.github.bucket4j.*;import java.time.Duration;

public class Bucket4jExample { public static void main(String[] args) { // Creamos un cubo: 10 tokens, recarga de 1 token por segundo Bandwidth limit = Bandwidth.simple(10, Duration.ofSeconds(1)); Bucket bucket = Bucket4j.builder().addLimit(limit).build();

for (int i = 0; i < 15; i++) { if (bucket.tryConsume(1)) { System.out.println("Solicitud #" + i + " ejecutada"); } else { System.out.println("Solicitud #" + i + " rechazada (límite excedido)"); } } }}


2. Resilience4j RateLimiter

Parte del popular framework para tolerancia a fallos. Funciona basado en SemaphoreBasedRateLimiter o AtomicRateLimiter. Se integra fácilmente con Spring Boot.

Ejemplo de configuración:

import io.github.resilience4j.ratelimiter.*;import java.time.Duration;

public class Resilience4jExample { public static void main(String[] args) { RateLimiterConfig config = RateLimiterConfig.custom() .limitForPeriod(5) // 5 solicitudes .limitRefreshPeriod(Duration.ofSeconds(1)) // cada segundo .timeoutDuration(Duration.ofMillis(100)) .build();

RateLimiter rateLimiter = RateLimiter.of("myService", config);

for (int i = 0; i < 8; i++) { Runnable task = R

Recommendations