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.
Timeout de visibilidad - Cómo los mensajes se vuelven "invisibles"
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.
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.
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.