Diagrama de flujo de mensajes entre productores y consumidores en una cola

Colas de mensajes

Colas de mensajes: reintentos, letras muertas y duplicados

Patrones para que un mensaje fallido no arrastre al resto del sistema

Cuando un consumidor falla, la cola puede convertirse en un amplificador de errores si no hay una política clara de reintentos. Lo vimos varias veces en producción: un servicio que responde lento por una dependencia externa empieza a devolver timeouts, el broker reencola los mensajes, el consumidor se satura, y en pocos minutos la cola crece más rápido de lo que cualquier worker puede procesar. El problema no es el fallo original, es la ausencia de un plan para cuando algo falla.

Este texto compara enfoques de backoff, colas de mensajes muertos y deduplicación por clave de idempotencia, con ejemplos de configuración en brokers conocidos. La idea es simple: cada mensaje que no se puede procesar tiene que tener un destino decidido de antemano, no improvisado durante el incidente.

Los reintentos infinitos esconden fallos de diseño. Si un mensaje lleva horas rebotando entre el broker y el consumidor, nadie está mirando por qué falla: solo se está evitando reconocer que ese mensaje no se va a procesar con el código actual. Un backoff exponencial con techo acotado y un número máximo de intentos deja el problema a la vista. A partir de ahí, la decisión es binaria: el mensaje pasa a una cola de mensajes muertos o se descarta con registro.

Medir la antigüedad de los mensajes pendientes es más útil que mirar el tamaño de la cola. Una cola con diez mil mensajes que se drenan en segundos está sana; una con doscientos mensajes que llevan una hora sin moverse está rota. Ese indicador, junto con la tasa de mensajes que terminan en la cola muerta, permite detectar acumulación antes de que el sistema se caiga.

La deduplicación por clave de idempotencia resuelve el otro extremo: reintentos que sí funcionan pero generan duplicados. Si el consumidor procesa el mismo mensaje dos veces porque el ack se perdió, el resultado depende del negocio. Para operaciones no idempotentes conviene guardar la clave procesada con una ventana de retención alineada al tiempo máximo de reintento. Sin esa ventana, la deduplicación no protege nada.

El cierre incluye criterios para decidir cuándo descartar un mensaje y cuándo alertar a un humano. Un mensaje con error de validación se descarta y se registra. Un mensaje que falla por una dependencia caída se reintenta. Un mensaje que lleva demasiado tiempo en la cola muerta sin que nadie lo revise es una alerta, no un pendiente.

Colas de mensajes: reintentos, letras muertas y duplicados

Estas definiciones no son un glosario decorativo. Son los puntos donde más discusiones se arman cuando un mensaje falla, se reintenta y termina en la cola de mensajes muertos. Conviene dejarlos por escrito antes de configurar cualquier broker.

Reintentar no es lo mismo que insistir

Un reintento es una decisión con límite: sabés cuántas veces vas a probar, con qué espaciado y qué hacer cuando se agota. Insistir es dejar al consumidor girando sobre el mismo mensaje sin política declarada. En este texto, cuando hablamos de reintentos nos referimos siempre a la primera definición. Los reintentos infinitos no son una estrategia: son una forma de esconder que el mensaje nunca va a procesarse con el código actual, y suelen tapar fallos de diseño como un payload mal formado o una dependencia externa caída que nadie está mirando.

Qué cuenta como letra muerta

Llamamos letra muerta a todo mensaje que agotó su política de reintentos y quedó fuera del flujo normal de consumo. No es basura automática: es una cola aparte donde el mensaje sigue existiendo, con su cabecera original, el motivo del último fallo y la cantidad de intentos. La distinción importa porque una letra muerta se puede reprocesar después de un arreglo, mientras que un mensaje descartado sin registro se pierde. En los ejemplos de configuración de brokers que aparecen más adelante, la letra muerta siempre tiene su propio destino, su propia retención y sus propias alertas.

Idempotencia y duplicados

Cuando un consumidor procesa un mensaje y falla justo antes de confirmar, el broker puede reenviarlo. Eso no es un error del broker: es el comportamiento esperado de la entrega al menos una vez. La deduplicación por clave de idempotencia es lo que evita que ese reenvío se convierta en una operación repetida en la base de datos. Aclaración importante: la clave de idempotencia no la inventa el broker, la tiene que poner el productor y el consumidor tiene que respetarla. Si el mensaje no trae una clave estable, ningún mecanismo de deduplicación va a funcionar por sí solo.

Backoff: espera, no castigo

El backoff es el tiempo que se espera entre un intento fallido y el siguiente. Cuando decimos backoff exponencial nos referimos a que ese intervalo crece con cada intento, no a una fórmula única. No es un castigo al mensaje ni una forma de silenciarlo: es una manera de no martillar una dependencia que ya está sufriendo. Un backoff sin techo puede dejar un mensaje esperando horas sin que nadie lo note, así que en los ejemplos siempre aparece un límite superior explícito y una métrica de antigüedad del mensaje pendiente que permite ver cuándo la cola se está acumulando.

Cuándo descartar y cuándo avisar

Descartar un mensaje es una decisión de negocio, no técnica. Si el payload es inválido de forma irrecuperable, reintentarlo solo consume recursos. Si el fallo depende de un servicio externo que puede volver, descartarlo pierde trabajo. La regla que usamos en este texto es simple: descarte silencioso cuando el error es determinista y el mensaje no aporta valor posterior; alerta a una persona cuando el error es transitorio, cuando la antigüedad de la cola supera un umbral acordado o cuando el volumen de letras muertas crece más rápido de lo habitual. Todo lo demás queda en zona gris y conviene revisarlo con el equipo antes de automatizarlo.

Colas de mensajes: reintentos, letras muertas y duplicados

Buckingham Cloud no es una marca con vocero único. Es un cuaderno de trabajo que mantiene un equipo de ingenieros de plataforma y SRE, gente que pasa el día mirando colas, paneles y manifiestos. Lo que se publica acá salió primero de un incidente real, de una migración a medio camino o de una comparación que hicimos para decidirnos entre dos herramientas.

No hay patrocinios ni contenido encargado. Cuando una entrada menciona un broker, un backend de estado o un proveedor de nube, es porque lo usamos, no porque nos paguen por nombrarlo.

Si querés seguir el hilo de lo que publicamos, hay un boletín semanal y un correo directo para consultas técnicas.

Escribir al equipo
Diagrama de flujo de mensajes entre productores y consumidores en una cola

Colas de mensajes: reintentos, letras muertas y duplicados

Un consumidor que falla no debería arrastrar a todo el sistema. Estas son las piezas que conviene mirar antes de decidir cuántas veces reintentar, dónde guardar lo que no se pudo procesar y cómo evitar que el mismo mensaje se ejecute dos veces.

Diagrama de flujo de mensajes entre productores y consumidores en una cola Reintentos con espera creciente

Backoff exponencial y su techo

Reintentar de inmediato solo amplifica el fallo. Una espera que crece entre intentos da tiempo a que la dependencia se recupere, pero necesita un techo razonable: sin límite superior, el último intento llega cuando ya nadie recuerda el incidente.

Diagrama de flujo de mensajes entre productores y consumidores en una cola Antigüedad de la cola

Medir la edad del mensaje pendiente

El tamaño de la cola engaña. Un backlog pequeño con mensajes de hace horas indica un consumidor atascado, no un pico de tráfico. La métrica útil es la antigüedad del mensaje más viejo sin procesar, no el conteo total.

Diagrama de flujo de mensajes entre productores y consumidores en una cola Cola de mensajes muertos

Dónde termina lo que no se pudo procesar

Una cola de mensajes muertos no es un vertedero: es un registro de fallos que alguien debe revisar. Si nadie la mira, los reintentos infinitos solo esconden un problema de diseño que sigue ahí.

Diagrama de flujo de mensajes entre productores y consumidores en una cola Idempotencia

Claves para no duplicar efectos

Cuando el reintento es inevitable, la clave de idempotencia evita que el mismo mensaje cobre dos veces, envíe dos correos o cree dos registros. El consumidor debe reconocer la clave antes de ejecutar la acción, no después.

Diagrama de flujo de mensajes entre productores y consumidores en una cola Cuándo alertar

Descartar o llamar a una persona

No todo mensaje fallido merece intervención humana. Un error de validación se descarta y se registra; un fallo de dependencia externa sostenido en el tiempo sí justifica avisar. La diferencia está en si el mensaje puede resolverse solo.

Colas de mensajes: reintentos, letras muertas y duplicados

Bitácora técnica independiente, sin patrocinio

Esta entrada sobre colas de mensajes la firma el equipo de ingenieros que sostiene la bitácora. Escribimos sobre lo que vemos en producción: reintentos que se disparan sin control, mensajes que quedan atascados y consumidores que se caen en cadena. No hay una redacción externa detrás ni un patrocinador marcando el tono. Cuando comparamos brokers o políticas de backoff, lo hacemos con fragmentos de configuración y paneles reales sobre la mesa, y anotamos también lo que no funcionó. Si algo de este texto te sirve para decidir mejor en tu sistema distribuido, ya cumplió su función.

Los temas que tocamos van desde Kubernetes y Terraform hasta observabilidad, costos de instancias y migración de servicios legados. Cada artículo se revisa antes de publicarse y se corrige cuando la práctica contradice lo que habíamos escrito.

Configuracion de cookies

Usamos cookies para mantener el sitio estable, recordar opciones basicas y entender que paginas resultan utiles. Puedes aceptar, rechazar o revisar la configuracion antes de continuar.