Tus usuarios ven esto:
HTTP/1.1 504 Gateway Timeout
{"message": "Endpoint request timed out"}Tu API gateway espero a que tu backend responda. Espero. Y espero. Y se rindio.
Que causa timeouts en el API gateway
- Queries de base de datos lentas: Indice faltante, lock de tabla, pool de conexiones agotado
- Llamadas a APIs externas que cuelgan: Stripe, Auth0 o un tercero lento/caido
- Cold starts (serverless): Inicializacion + consulta lenta = timeout
- Backend inalcanzable: DNS, firewall, servidor caido
- Respuesta demasiado grande: JSON masivo que tarda en serializar
- Loops infinitos o deadlocks: Bug de codigo que nunca completa
Limites de timeout por plataforma
| Plataforma | Default | Maximo |
|---|---|---|
| AWS API Gateway (REST) | 29s | 29s (limite duro) |
| Kong | 60s | Sin limite |
| Nginx | 60s | Sin limite |
| Vercel | 10s (Hobby) | 300s (Enterprise) |
Como solucionarlo
- Identificar que endpoint hace timeoutHabilitar access logs en el gateway
- Verificar si el backend es alcanzableTestear conectividad DNS/red
- Perfilar el endpoint lentoAgregar timing a cada operacion (DB, API externa, transformacion)
- Solucionar la causa raizIndices, caching, circuit breakers, pool de conexiones
- Para operaciones inherentemente lentas: Patron asincrono (202 Accepted + polling)
Como monitorear timeouts antes que los usuarios los reporten
La version mas simple es un chequeo programado que mide tus endpoints mas lentos y alerta bastante antes del limite del gateway:
// check-latency.ts, correlo cada minuto con cron
const start = Date.now()
const res = await fetch('https://api.example.com/api/reports', {
signal: AbortSignal.timeout(29_000),
})
const ms = Date.now() - start
// notify() = tu webhook de Slack, email o pager
if (!res.ok || ms > 10_000) await notify(`/api/reports: ${res.status} in ${ms}ms`)Alertá a una fraccion del limite (aca 10 segundos contra un timeout de 29), asi tenes margen para arreglarlo antes de que el gateway empiece a cortar requests. En produccion, medi tambien la latencia P95 por ruta con trafico real (por ejemplo con OpenTelemetry).
