Inicio / Blog / Arquitectura con colas
Arquitectura backend y sistemas distribuidos

Arquitectura con colas para equipos pequeños: async sin misterio

Una cola sirve cuando conviene aceptar rápido una petición y completar el trabajo después, cuando depende de servicios inestables o exige controlar el caudal. También añade otro runtime, resultados demorados y posibles duplicados. Añádela para resolver un cuello de botella concreto, no solo porque los diagramas se ven mejor.

Separa la aceptación de la petición de la finalización

Persiste la intención, publica el trabajo, procésalo de forma segura y muestra el resultado
1 / SolicitudValida al cliente y la intención de negocio.
2 / PersistirGuarda operación y evento outbox juntos.
3 / EntregarEl dispatcher publica un mensaje duradero.
4 / ConsumirEl worker reserva, procesa y registra estado.
5 / ObservarEl cliente consulta; operaciones vigila retrasos.

Devuelve un ID y estado “aceptado/en curso”, no un éxito que sugiera que informe, correo o pago ya terminó. Define cómo consultar, qué significa cancelar y si se reintenta automáticamente o requiere revisión.

Elige trabajo que gane con async

CargaLa cola ayuda si...Aún hay que definir...
Efectos de webhookEl proveedor espera acuse rápido.Firma, aceptación duradera, dedupe y orden.
Informes o exportacionesTarda o necesita más recursos.Visibilidad, cancelación, caducidad y progreso.
Sincronización con API externaLímites o caídas no deben bloquear usuarios.Backoff, presupuesto, vigencia y conciliación.
NotificacionesPuede retrasarse sin cambiar la transacción confirmada.Preferencias, duplicados y estado visible.

Mantén síncrono el trabajo que exige respuesta autorizada inmediata y cabe en el presupuesto de la petición. Una cola no acelera un algoritmo caro; cambia quién espera y cómo se observa.

Cierra la brecha entre base y cola

Un fallo típico es guardar un pedido y caer antes de publicar el mensaje. Outbox transaccional registra estado y evento pendiente en la misma transacción; un dispatcher publica y marca entrega. El consumidor aún debe tolerar duplicados si el proceso cae tras publicar pero antes de guardar éxito. Para riesgos menores puede bastar una tabla de jobs persistida con recuperación explícita.

Asume entrega al menos una vez

Muchas colas pueden repetir mensajes tras timeout o crash. Asigna ID estable a la operación, aplica unicidad o registro de idempotencia y haz idempotentes los efectos externos. Confirma/elimina solo tras completar de forma duradera. Si el worker supera el visibility timeout, extiéndelo o divide el trabajo para impedir consumo paralelo.

Los reintentos necesitan límite y motivo

Reintenta fallos temporales de red, rate limit y dependencias con backoff exponencial y jitter. No repitas sin fin entradas malformadas ni permisos inválidos. Limita intentos y duración; después pasa el mensaje a dead letter/cuarentena con motivo y correlación. Ofrece replay seguro que conserve el ID lógico y registre un nuevo intento.

Backpressure también informa al producto

Limita profundidad o antigüedad y decide qué ve el usuario si crece el backlog. Escala consumidores solo si el destino puede absorberlo. Si llegan más tareas de las que se procesan, más workers saturan base o partner. Aplica límites de concurrencia, lote, equidad por cliente y control al productor. La edad suele explicar más que el número de mensajes.

Observabilidad durante el ciclo del job

Mide aceptado, en cola, iniciado, reintentado, terminado y fallido con horas e IDs de correlación. Alerta sobre mensaje más antiguo, retries, DLQ, errores del consumidor y throttling. Minimiza payloads y datos sensibles en logs. Retención de mensajes y de historial de jobs son políticas diferentes.

Empieza con el diseño operable más pequeño

Una cola gestionada, un worker y una tabla de estado suele bastar. No introduzcas clúster de broker y orquestación propia antes de necesitarlos. Documenta responsable, despliegue/rollback, mensajes venenosos, autorización de replay y qué ocurre si la cola no está disponible.

En resumen

Las colas separan aceptación y finalización, pero trasladan complejidad a retries, duplicados, visibilidad y operación. Persiste intención, publica de forma fiable, procesa con idempotencia, limita reintentos y expón estado. Añade colas para resolver un problema real y conserva un modelo que el equipo pueda operar.

Referencias