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

PlataformaDefaultMaximo
AWS API Gateway (REST)29s29s (limite duro)
Kong60sSin limite
Nginx60sSin limite
Vercel10s (Hobby)300s (Enterprise)

Como solucionarlo

  1. Identificar que endpoint hace timeoutHabilitar access logs en el gateway
  2. Verificar si el backend es alcanzableTestear conectividad DNS/red
  3. Perfilar el endpoint lentoAgregar timing a cada operacion (DB, API externa, transformacion)
  4. Solucionar la causa raizIndices, caching, circuit breakers, pool de conexiones
  5. 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).