Módulo 08Trimestre 3 · Fiabilidad y escala10 puntos del póster
Asincronía, eventos y tiempo real
Inicia sesión para guardar tu progreso en todos tus dispositivos. Mientras tanto, se guarda en este navegador.
Por qué importa
Enviar un email, generar un PDF, llamar a un agente LLM, procesar un webhook: si esto se ejecuta dentro de la petición del usuario, la petición es lenta, supera los límites de tiempo de serverless y pierde trabajo ante cualquier caída. El diseño asíncrono es la forma en que los sistemas serios se mantienen rápidos y no pierden nada.
Resultados de aprendizaje
- Mover el trabajo lento o poco fiable a jobs en segundo plano duraderos.
- Elegir entre colas, pub/sub y diseños orientados a eventos.
- Manejar webhooks de forma segura (verificar, deduplicar, confirmar rápido, procesar en asíncrono).
- Coordinar flujos de varios pasos con sagas y el patrón outbox.
- Elegir el transporte en tiempo real adecuado: WebSockets, SSE o long polling.
- Ejecutar tareas programadas que puedan solaparse y saltarse sin problemas.
Lecciones
8.1 Colas y workers (15)
Patrón: la petición valida, escribe la intención en la base de datos, encola el job y devuelve 202 Accepted con un ID de job. El worker procesa, actualiza el estado y notifica.
- En la práctica, la entrega es at-least-once (al menos una vez): diseña cada handler de jobs para que sea idempotente.
- Opciones: gestionadas (SQS, Cloud Tasks), basadas en Redis (BullMQ), basadas en Postgres (pg-boss, Graphile Worker), motores de workflows duraderos (Inngest, Trigger.dev, Temporal).
- Los motores de workflows duraderos suelen ser la mejor opción para agentes de IA: cada paso se guarda como checkpoint y se reintenta de forma independiente.
8.2 Pub/Sub y arquitectura orientada a eventos (16, 17)
- Cola: un mensaje, un consumidor (una tarea por hacer).
- Pub/Sub: un evento, muchos suscriptores independientes (un hecho que ocurrió:
order.paid). - Orientada a eventos: los servicios reaccionan a eventos en lugar de llamarse directamente. Desacoplada, pero más difícil de trazar; exige esquemas para los eventos y buena observabilidad.
- Nombra los eventos en pasado; versiona los esquemas de eventos; incluye un ID de evento para deduplicar.
8.3 Transacciones distribuidas, outbox y sagas (18, 19)
- No puedes tener una sola transacción ACID que abarque tu base de datos, Stripe y un proveedor de email.
- Transactional outbox: en la misma transacción de base de datos, escribe el cambio de negocio y una fila en el outbox; un relay publica las filas del outbox. Evita el "guardado pero nunca publicado" o el "publicado pero no guardado".
- Saga: una secuencia de pasos locales, cada uno con una acción compensatoria (reservar stock → cobrar la tarjeta → crear el envío; si el envío falla: reembolsar, liberar el stock). Orquestada (un coordinador) o coreografiada (eventos).
- El two-phase commit existe, pero rara vez es apropiado en sistemas web modernos.
8.4 Webhooks (101)
Al recibir:
- Verifica la firma (HMAC con secreto compartido) y el timestamp para frenar falsificaciones y ataques de repetición (replay).
- Deduplica por el ID de evento del proveedor (restricción única).
- Confirma rápido (2xx en pocos segundos) y luego procesa en un job en segundo plano.
- Maneja la entrega fuera de orden; ante la duda, consulta el estado actual al proveedor. Al enviar: firma los payloads, reintenta con backoff, ofrece a los clientes un log de entregas y la opción de reenviar, y protégete del SSRF en las URLs que proporcionan los clientes.
8.5 Cron jobs (21)
- Asume que una ejecución puede saltarse, retrasarse o ejecutarse dos veces. Haz que los jobs sean idempotentes y reanudables.
- Evita solapamientos con un lock (advisory lock de la base de datos).
- Procesa por lotes con checkpoints, no en una única transacción gigante.
- Monitoriza con un heartbeat tipo "dead man's switch" (alerta si el job no se ejecutó).
- Guarda los horarios en UTC; cuidado con el horario de verano en otros mercados.
8.6 Transportes en tiempo real (22, 23, 24)
| Transporte | Dirección | Úsalo cuando |
|---|---|---|
| SSE | Del servidor al cliente | Streaming de tokens de LLM, notificaciones, progreso. Sencillo, funciona sobre HTTP, reconexión automática |
| WebSockets | En ambos sentidos | Chat, colaboración, juegos en directo, voz |
| Long polling | Push simulado | Alternativa donde el streaming está bloqueado |
| Consideraciones: autentica la conexión, vuelve a autorizar en conexiones de larga duración, gestiona la reconexión y los mensajes perdidos (reanuda desde el último ID de evento), ten en cuenta que las plataformas serverless pueden limitar la duración de las conexiones; a escala, usa un servicio gestionado de tiempo real (Supabase Realtime, Pusher, Ably, Cloudflare Durable Objects). |
Lab 8: Hazlo asíncrono
- Mueve tu operación síncrona más lenta (llamada al LLM, PDF, email) a un job duradero con consulta de estado (polling) o progreso por SSE.
- Implementa un receptor de webhooks (Stripe o Resend) con verificación de firma, deduplicación y procesamiento asíncrono. Reenvía el mismo evento 10 veces; demuestra que solo produce un efecto.
- Implementa una saga de 3 pasos con compensación; inyecta un fallo en el paso 3; demuestra el rollback.
- Añade un cron job con lock contra solapamientos y alerta por heartbeat.
Definition of Done
Paquete de prompts de IA
- "Identifica todas las operaciones de los handlers de peticiones que llaman a un servicio externo o que podrían tardar más de 1 segundo. Propón cuáles mover a jobs en segundo plano."
- "Implementa este handler de webhooks: verifica la firma con comparación en tiempo constante, rechaza timestamps caducados, deduplica por event id con una restricción única, encola el procesamiento y devuelve 200."