Un endpoint genera un informe en 2 minutos. ¿Cuál es el mejor diseño de API?
Opciones
- Mantener la petición HTTP abierta los dos minutos completos
- Encolar un trabajo, devolver 202 Accepted con una URL de estado y consultar (Opción correcta)
- Devolver un error 500 y pedir al cliente que reintente después
- Usar una petición GET con un timeout muy grande en el cliente
Respuesta
Encolar un trabajo (Celery/RQ/SQS), devolver 202 Accepted con una URL de estado, y que el cliente consulte o reciba un webhook
Por qué
Los load balancers y proxies suelen cortar las conexiones tras 30-60 segundos, y un usuario mirando un spinner es mala UX.
En su lugar: pon el trabajo en una cola, responde de inmediato con 202 Accepted y una URL como /reports/123/status. Un background worker hace el trabajo.
El cliente consulta la URL de estado (polling) o recibe un aviso (webhook/WebSocket) cuando está listo.
Recuerda
Trabajo lento → background job + 202 Accepted.