Evitar que tumben la página — DDoS y resiliencia
Cómo pueden dejarte fuera de línea
Sección titulada «Cómo pueden dejarte fuera de línea»- Saturar ancho de banda o conexiones.
- Enviar muchas requests HTTP aparentemente válidas.
- Golpear búsquedas, exportaciones, login o generación de IA que consumen CPU/dinero.
- Evitar caché cambiando query params o headers.
- Abrir conexiones lentas, subir archivos enormes o provocar fan-out a terceros.
Un límite de solicitudes dentro de una única instancia no detiene un ataque volumétrico: el tráfico ya alcanzó el servidor de origen.
Capas de defensa
Sección titulada «Capas de defensa»- Edge/CDN con mitigación DDoS: absorber volumen y cachear contenido.
- Ocultar/proteger el origen: DNS proxied, firewall que acepte solo el proxy y conexión autenticada al origen.
- WAF y bot controls: reglas administradas, challenges y bloqueo gradual.
- Rate limits distribuidos: por cuenta, token, IP y acción; límites más estrictos para endpoints caros.
- Límites de recursos: body, uploads, concurrencia, tiempo de query y llamadas externas.
- Degradación: servir caché, desactivar funciones no esenciales y poner trabajos en cola.
Diseño resistente
Sección titulada «Diseño resistente»- Timeouts en cliente, servidor, DB y terceros.
- Circuit breaker para no amplificar la caída de un proveedor.
- Colas con tamaño máximo y backpressure.
- Caché con claves normalizadas para evitar bypass accidental.
- Idempotencia para reintentos de operaciones mutables.
- Presupuesto/circuito para APIs cobradas por uso.
Preparación
Sección titulada «Preparación»Alerta por requests, ancho de banda, hit ratio, p95/p99, 429, 5xx, saturación y costo. Documenta cómo activar reglas más estrictas, contactar al proveedor, escalar capacidad y comunicar estado. Prueba el runbook con carga autorizada; nunca lances pruebas contra infraestructura ajena.
Rate limiting que representa el riesgo
Sección titulada «Rate limiting que representa el riesgo»Un límite global por IP no basta para un sistema con usuarios autenticados y proxies. Combina varias claves y define una respuesta clara:
const key = `${accountId ?? 'anon'}:${action}:${ipPrefix}`const result = await limiter.consume(key, { points: 1, duration: 10 })
if (!result.allowed) { return new Response('Too many requests', { status: 429, headers: { 'Retry-After': String(result.retryAfterSeconds) }, })}El almacén debe ser compartido entre instancias y la dirección IP debe obtenerse de una cadena de proxies confiable, no de un encabezado que cualquiera pueda inventar. Para inicio de sesión, recuperación, búsquedas costosas y generación de archivos, usa límites diferentes.
Proteger el origen y el costo
Sección titulada «Proteger el origen y el costo»Si un CDN está delante, restringe el firewall del origen a sus rangos o usa autenticación entre edge y origen. El contenido público debe cachearse con claves normalizadas; las rutas dinámicas necesitan límites de concurrencia, timeouts y consultas acotadas. Desactiva temporalmente una función cara o pásala a una cola antes de dejar que una avalancha consuma la base de datos.
Runbook de disponibilidad
Sección titulada «Runbook de disponibilidad»- Confirma si el problema es volumen, aplicación, proveedor o despliegue.
- Activa una regla temporal y protege endpoints caros.
- Sirve caché o una página degradada si el negocio lo permite.
- Revisa logs agregados, costo, errores y saturación sin buscar request por request.
- Retira la regla gradualmente y documenta qué señal la activó.