Esta guía está dirigida a administradores del sistema. Si eres desarrollador y buscas información sobre cómo usar la API con rate limiting, consulta la Guía de Rate Limiting para Usuarios.
Variables de Entorno
# Límites individuales por usuario/IP
RATE_LIMIT_DEFAULT=200 per hour # Límite por usuario/hora
RATE_LIMIT_BURST=50 per minute # Límite por usuario/minuto
# Límites globales para toda la aplicación
RATE_LIMIT_GLOBAL=5000 per hour # Límite total/hora para todos los usuarios
RATE_LIMIT_GLOBAL_BURST=1000 per minute # Límite total/minuto para todos los usuarios
# Almacenamiento (usar Redis en producción)
RATE_LIMIT_STORAGE_URI=memory:// # Desarrollo: memory://
# Producción: redis://localhost:6379
Cómo Ajustar los Límites
Para Desarrollo
Los valores por defecto son apropiados para testing:
- Individuales: 200/hora, 50/min
- Globales: 5000/hora, 1000/min
Para Producción - Servidor Pequeño (2 CPUs, 4GB RAM)
Configuración Recomendada
RATE_LIMIT_DEFAULT=100 per hour
RATE_LIMIT_BURST=25 per minute
RATE_LIMIT_GLOBAL=2000 per hour
RATE_LIMIT_GLOBAL_BURST=400 per minute
Para Producción - Servidor Mediano (4 CPUs, 8GB RAM)
Configuración Recomendada
RATE_LIMIT_DEFAULT=200 per hour
RATE_LIMIT_BURST=50 per minute
RATE_LIMIT_GLOBAL=5000 per hour
RATE_LIMIT_GLOBAL_BURST=1000 per minute
Para Producción - Servidor Grande (8+ CPUs, 16GB+ RAM)
Configuración Recomendada
RATE_LIMIT_DEFAULT=500 per hour
RATE_LIMIT_BURST=100 per minute
RATE_LIMIT_GLOBAL=15000 per hour
RATE_LIMIT_GLOBAL_BURST=3000 per minute
Guía de Dimensionamiento
Calcular Límite Global Apropiado
- Determina el número de usuarios concurrentes esperados
Ejemplo: 50 usuarios activos simultáneamente
- Multiplica por su uso promedio
Ejemplo: 50 usuarios × 50 peticiones/min = 2500 pet/min
- Añade margen de seguridad (20-30%)
Ejemplo: 2500 × 1.3 = 3250 pet/min
- Ajusta según capacidad del servidor
- Monitorea CPU, memoria y latencia
- Si CPU > 80%, reduce límites
- Si CPU < 50%, puedes incrementar
Fórmula Rápida
Límite Global = (Usuarios Concurrentes × Límite Individual) × Factor de Seguridad
Factor de Seguridad:
- 1.5 = Servidor robusto, tráfico predecible
- 1.3 = Servidor normal, tráfico variable
- 1.2 = Servidor limitado, tráfico impredecible
Usar Redis en Producción
Instalar Redis
# Docker
docker run -d -p 6379:6379 redis:alpine
# macOS
brew install redis
brew services start redis
# Ubuntu/Debian
sudo apt install redis-server
sudo systemctl start redis
Configurar
RATE_LIMIT_STORAGE_URI=redis://localhost:6379
Redis con Autenticación
RATE_LIMIT_STORAGE_URI=redis://:password@localhost:6379
Redis Cluster
RATE_LIMIT_STORAGE_URI=redis://node1:6379,node2:6379,node3:6379
Monitorización
Logs a Revisar
# Ver límites excedidos
grep "Rate limit exceeded" logs/app.log
# Ver por usuario
grep "Rate limit exceeded: user:" logs/app.log | sort | uniq -c
# Ver por IP
grep "Rate limit exceeded: [0-9]" logs/app.log | sort | uniq -c
Métricas Recomendadas
- Tasa de error 429
- < 1% = OK
- 1-5% = Revisar
- > 5% = Límites muy bajos o ataque DoS
- Distribución de uso
- Ver qué usuarios/IPs consumen más
- Identificar posibles abusos
- Uso de límite global
- Si se alcanza frecuentemente, considera escalar verticalmente
Troubleshooting
Problema: Muchos 429 en producción
Síntomas: Usuarios legítimos reciben 429
Causas posibles:
- Límites muy bajos
- Límite global alcanzado por tráfico legítimo alto
- Bot o crawler agresivo
Soluciones:
- Incrementar RATE_LIMIT_GLOBAL_BURST
- Identificar y bloquear bots (User-Agent)
- Escalar servidor
Problema: Límite global no se respeta
Síntomas: Más peticiones de las esperadas
Causas posibles:
- Usando memory:// con múltiples workers Gunicorn
- Rate limiter no inicializado correctamente
Soluciones:
- Cambiar a Redis: RATE_LIMIT_STORAGE_URI=redis://localhost:6379
- Verificar logs de inicio: "✅ Rate limiter inicializado"
Problema: Alto uso de memoria Redis
Síntomas: Redis consume mucha RAM
Causas posibles:
- Muchos usuarios únicos (cada uno tiene entrada)
- Ventanas de tiempo muy largas
Soluciones:
- Reducir ventanas (ej: 30 min en vez de 1 hora)
- Configurar eviction policy en Redis: maxmemory-policy allkeys-lru
Seguridad
Prevenir Bypass
# Cliente puede cambiar IP y bypass
if client_ip in whitelist:
skip_rate_limit()
# Usa tokens de servicio con límites más altos
if has_service_token():
apply_higher_limits()
Whitelist de IPs
Si necesitas whitelist (ej: servicios internos):
# En rate_limiter.py
WHITELISTED_IPS = os.getenv('RATE_LIMIT_WHITELIST_IPS', '').split(',')
def get_identifier():
ip = get_remote_address()
if ip in WHITELISTED_IPS:
return f"whitelisted:{ip}" # Sin límite o límite superior
# ... resto del código
Testing
Test de Límite Individual
# Debe fallar después de 50 peticiones
for i in {1..60}; do
curl -H "Authorization: Bearer $TOKEN" http://localhost:5000/contratos
done
Test de Límite Global
# Simular 30 usuarios simultáneos
seq 1 30 | xargs -P30 -I{} bash -c '
for i in {1..40}; do
curl -s http://localhost:5000/tarifas > /dev/null
done
'
# Debería empezar a dar 429 después de 1000 peticiones totales
Última actualización: 10 de Febrero, 2026