SQS realmente entrega mensajes "al menos una vez" - Cómo funciona la entrega At-Least-Once y sus trampas

Exploramos por qué las colas Standard de SQS producen duplicados bajo la entrega At-Least-Once, cómo funciona el timeout de visibilidad, el procesamiento Exactly-Once de FIFO y el diseño de idempotencia.

Qué es la entrega At-Least-Once

Las colas Standard de SQS garantizan la entrega "al menos una vez" (At-Least-Once). Esto significa que cada mensaje se entrega al menos una vez, pero puede entregarse más de una vez. Los duplicados ocurren porque SQS almacena mensajes en múltiples servidores para alta disponibilidad. Cuando un consumidor solicita mensajes, la solicitud puede llegar a un servidor que aún no ha registrado que el mensaje ya fue procesado por otro consumidor. Este es un compromiso de diseño deliberado: SQS prioriza la disponibilidad y durabilidad sobre la entrega exactamente una vez en colas Standard. Este artículo explica el mecanismo detrás del comportamiento que la documentación oficial de AWS describe como entrega at-least-once, con enlaces a las fuentes primarias al final.

¿Cómo previene el timeout de visibilidad el procesamiento duplicado?

Cuando un consumidor recibe un mensaje, SQS no lo elimina inmediatamente. En su lugar, lo hace invisible para otros consumidores durante el período de timeout de visibilidad (por defecto 30 segundos). Si el consumidor procesa exitosamente el mensaje y lo elimina antes del timeout, el flujo es normal. Si el consumidor falla o no elimina el mensaje a tiempo, el mensaje vuelve a ser visible y otro consumidor puede recibirlo, causando un procesamiento duplicado. Ajustar el timeout de visibilidad es crítico: demasiado corto causa duplicados innecesarios, demasiado largo retrasa el reprocesamiento de mensajes fallidos.

Figura: cómo transcurre el timeout de visibilidad y dónde nacen los duplicados
  1. 1. Recepción (ReceiveMessage)El timeout de visibilidad (30 segundos por defecto) empieza en el instante en que un consumidor recibe el mensaje, y los demás consumidores no lo ven mientras corre el reloj.
  2. 2. ProcesamientoLa cuenta atrás avanza sin importar cuánto haya progresado el procesamiento. Si el trabajo puede alargarse, amplía el plazo con ChangeMessageVisibility (patrón de heartbeat).
  3. 3. Rama A - se llamó a DeleteMessage a tiempoEl mensaje sale de la cola y el trabajo se realiza una sola vez. No hay duplicado.
  4. 4. Rama B - no se eliminó antes del plazoEl mensaje vuelve a ser visible y se entrega a otro consumidor. Aunque el procesamiento original haya tenido éxito, aquí nace el duplicado.
  5. 5. Fin de los reintentosCuando el número de recepciones supera maxReceiveCount, el mensaje pasa a la cola de mensajes no entregados y termina el bucle infinito de reentregas.

Procesamiento Exactly-Once con colas FIFO

Las colas FIFO de SQS proporcionan procesamiento exactamente una vez (Exactly-Once) mediante IDs de deduplicación. Cuando se envía un mensaje con un ID de deduplicación, SQS rechaza mensajes duplicados con el mismo ID dentro de una ventana de 5 minutos. Combinado con grupos de mensajes que garantizan el orden, FIFO elimina tanto los duplicados como el desorden. El compromiso es el throughput: FIFO soporta 300 mensajes/segundo (3,000 con batching), mientras que Standard es prácticamente ilimitado.

Tabla: así tratan los duplicados y el orden las colas estándar y FIFO
AspectoCola estándarCola FIFO
Garantía de entregaAt-Least-Once: el mismo mensaje puede llegar dos veces o másProcesamiento Exactly-Once dentro de la ventana de deduplicación
OrdenMejor esfuerzo: los mensajes pueden llegar en distinto orden del enviadoOrden de envío estricto dentro de cada MessageGroupId
Mecanismo de deduplicaciónNinguno. Se absorbe con un consumidor idempotenteVentana de deduplicación de 5 minutos con MessageDeduplicationId
Consumo paralelo en un grupoSin restricción: varios trabajadores procesan a la vezEl siguiente mensaje no se entrega hasta que se elimina el anterior
RendimientoPrácticamente ilimitado300 mensajes por segundo (3.000 con lotes de 10); ampliable con el modo de alto rendimiento
Disponible desdeEl lanzamiento inicial del servicio2016

Diseño de idempotencia - Arquitectura que asume duplicados

En lugar de depender exclusivamente de FIFO, el enfoque recomendado es diseñar consumidores idempotentes que produzcan el mismo resultado independientemente de cuántas veces procesen el mismo mensaje. Las técnicas incluyen: almacenar IDs de mensaje procesados en DynamoDB con operaciones condicionales, usar transacciones de base de datos para verificar antes de actuar, diseñar operaciones que sean naturalmente idempotentes (como PUT en lugar de POST), y utilizar claves de idempotencia en APIs downstream. Este diseño es más robusto que depender de garantías de entrega del sistema de mensajería.

Cola de mensajes no entregados - Destino de los mensajes que no se pueden procesar

La cola de mensajes no entregados (DLQ) captura mensajes que han excedido el número máximo de recepciones (maxReceiveCount) sin ser eliminados exitosamente. Esto previene que mensajes problemáticos (formato inválido, dependencias faltantes) bloqueen el procesamiento de mensajes válidos. La DLQ permite investigar fallos sin perder datos, implementar alertas cuando se acumulan mensajes, y reprocesar mensajes después de corregir el problema. La función de redrive permite mover mensajes de la DLQ de vuelta a la cola original para reprocesamiento.

Referencias (documentación oficial de AWS)

Las fuentes primarias del comportamiento explicado en este artículo son las siguientes páginas de la guía para desarrolladores de Amazon SQS: Amazon SQS at-least-once delivery, que define la garantía de entrega de las colas Standard; Amazon SQS visibility timeout, que describe cómo los mensajes en procesamiento se ocultan de otros consumidores; y Exactly-once processing in Amazon SQS, que explica la deduplicación en colas FIFO. Si este artículo y la documentación oficial difieren en algún punto, la documentación oficial es la fuente autoritativa.

Compartir