Análisis profundo de Amazon SQS: Guía de “diseño de colas” aprendida comparando servicios Pub/Sub (SNS, GCP Pub/Sub, Azure Service Bus)
Introducción (Puntos clave)
- En este artículo nos centraremos en Amazon Simple Queue Service (Amazon SQS) como personaje principal, y lo compararemos también con:
- AWS SNS / EventBridge
- Google Cloud Pub/Sub
- Azure Service Bus / Storage Queues
para organizar qué significa diseñar mensajería y colas para sistemas distribuidos débilmente acoplados.
- Amazon SQS es un servicio de colas de mensajes totalmente gestionado que facilita la implementación de:
- Comunicación entre microservicios
- Trabajos en segundo plano / procesamiento por lotes
- Absorción de picos de carga (buffering)
- En GCP tienes Cloud Pub/Sub, y en Azure tienes Service Bus / Storage Queues desempeñando roles similares. En cualquier nube importante, la idea compartida es:
Un “canal de mensajes” que conecta de forma débil el emisor y el receptor.
- Los puntos clave de diseño son:
- Dónde trazar la línea entre APIs síncronas y mensajes asíncronos
- Elegir entre FIFO (ordenado) y Standard (alto rendimiento)
- Diseñar visibility timeout, comportamiento de reintentos y dead-letter queues (DLQ)
- Cómo definir esquema de mensajes y versionado
- Aprender patrones de mensajería que funcionen en varias nubes
- Este artículo está pensado para:
- Desarrolladores backend / desarrolladores de microservicios
- Ingenieros que diseñan procesamiento por lotes y pipelines de datos
- Ingenieros SRE / de infraestructura (diseño de operaciones)
- Líderes técnicos que diseñan arquitecturas pensando también en GCP / Azure
- Al final deberías ser capaz de explicar con tus propias palabras decisiones como:
“Esta parte es una API síncrona, esto pasa por una cola SQS y esto debería difundirse al estilo Pub/Sub.”
1. ¿Qué es Amazon SQS? Una cola de mensajes que “conecta débilmente” aplicaciones
1.1 Visión general del servicio
Amazon SQS (Simple Queue Service) es un servicio de colas de mensajes totalmente gestionado proporcionado por AWS.
En pocas palabras:
“El productor (emisor) coloca mensajes en una cola,
y el consumidor (receptor) más tarde los extrae en orden y los procesa.”
Características clave:
- Serverless y totalmente gestionado
- AWS se encarga de construir los servidores de colas, la redundancia, el parcheo y la gestión de capacidad.
- Altamente escalable
- Escala automáticamente a medida que crecen el volumen de mensajes y el tráfico.
- Entrega al menos una vez (at-least-once delivery)
- Debes diseñar suponiendo que el mismo mensaje podría entregarse más de una vez.
- Dos tipos de cola
- Cola Standard: alto rendimiento, el orden es “best-effort” (mejor esfuerzo)
- Cola FIFO: ordenada y con desduplicación, pero con menor rendimiento
A diferencia de ejecutar tu propia cola de mensajes (como RabbitMQ o ActiveMQ) on-premises,
con SQS puedes simplemente “crear una cola y empezar a usarla al momento”; ese es gran parte de su atractivo.
1.2 Servicios similares en otras nubes
Servicios conceptualmente similares incluyen:
- Google Cloud Pub/Sub
- Servicio de publicación/suscripción de alto rendimiento; admite tanto push como pull.
- Azure Service Bus
- Mensajería rica en funcionalidades (colas + topics + suscripciones).
- Azure Storage Queues
- Servicio de colas más simple y barato construido sobre Blob Storage.
GCP Pub/Sub y Azure Service Bus son fuertes en difusión (un mensaje a muchos suscriptores),
mientras que SQS está básicamente construido sobre el modelo de que “un mensaje en una cola lo procesa un único consumidor”
(aunque puedes usarlo en un estilo Pub/Sub cuando lo combinas con SNS o EventBridge).
2. Cola Standard vs cola FIFO: ¿Cuál es la diferencia?
2.1 Cola Standard
Una cola Standard es el tipo de cola SQS por defecto, con las siguientes características:
- Rendimiento prácticamente ilimitado
- El orden de los mensajes es “best-effort”
- A menudo los mensajes llegan en el orden en que se enviaron, pero no se garantiza un orden estricto.
- Los mensajes pueden entregarse más de una vez (entrega al menos una vez)
A cambio, las colas Standard están muy bien adaptadas a cargas de trabajo con mucho tráfico.
2.2 Cola FIFO (First-In-First-Out)
Una cola FIFO proporciona:
- Orden garantizado de los mensajes, y
- Desduplicación (de-dup)
Puntos clave:
- El orden está garantizado por grupo de mensajes,
- es decir, los mensajes con el mismo
MessageGroupIdse procesan en el orden en que llegan.
- es decir, los mensajes con el mismo
- Con un
MessageDeduplicationIdpuedes garantizar que
“el mismo mensaje enviado dos veces se procese solo una vez”. - El rendimiento es menor que en las colas Standard y debe tenerse en cuenta en el diseño.
Para cargas de trabajo donde no se debe romper el orden (por ejemplo, actualizar el saldo de la cuenta de un único usuario),
o donde el doble procesamiento es inaceptable, las colas FIFO son una opción.
Para la mayoría del resto de casos, sin embargo, las colas Standard son más simples y escalan mejor,
por lo que generalmente se recomienda empezar con colas Standard.
3. Fundamentos de SQS: envío, recepción y visibility timeout
3.1 Ciclo de vida del mensaje
El flujo básico de SQS es muy simple:
- El productor envía un mensaje a la cola con
SendMessage. - El consumidor recibe el mensaje con
ReceiveMessage. - Cuando el procesamiento termina, el consumidor llama a
DeleteMessagepara eliminar el mensaje de la cola.
El concepto clave aquí es el “visibility timeout”.
3.2 ¿Qué es el visibility timeout?
Justo después de que se recupere un mensaje con ReceiveMessage,
ese mensaje queda oculto para otros consumidores durante un período de tiempo.
Ese período se llama visibility timeout.
- El valor por defecto es 30 segundos (configurable por cola).
- Si el procesamiento termina durante este período, el consumidor llama a
DeleteMessage. - Si el procesamiento falla y no se llama a
DeleteMessage,
el mensaje vuelve a ser visible en la cola cuando expira el timeout,
y entonces otro consumidor puede recogerlo.
Este mecanismo:
- Cubre los casos en que un consumidor se cae a mitad del procesamiento,
- El mensaje reaparece para volver a procesarse después del timeout, y
- Es menos probable que se pierdan mensajes,
proporcionando una especie de “comportamiento de auto-reintento incorporado”.
Sin embargo, dado que el mismo mensaje puede procesarse dos veces, debes diseñar pensando en:
- “Procesar cada
order_idsolo una vez” (por ejemplo, registrando los IDs ya procesados en una BD), y - “Hacer que el procesamiento sea idempotente (que la misma entrada pueda procesarse varias veces sin efectos secundarios dañinos).”
Esto es fundamental que lo resuelva tu aplicación.
4. Dead-Letter Queues (DLQ): un aparcamiento para mensajes fallidos
4.1 ¿Por qué necesitamos una DLQ?
De vez en cuando aparecen mensajes problemáticos como estos:
- Mensajes que fallan cada vez que intentas procesarlos (por ejemplo, debido a bugs o a un formato de datos inesperado)
- Mensajes que no pueden procesarse por razones externas (por ejemplo, una caída prolongada de un sistema downstream)
- Mensajes inválidos o corruptos
Si dejas esos mensajes en la cola principal:
- Podrían reintentarse una y otra vez en bucle, y
- Pueden retrasar el procesamiento de los mensajes “sanos”.
Ahí es donde entra en juego la Dead-Letter Queue (DLQ) o cola de mensajes muertos.
4.2 Cómo funciona una DLQ
Para una cola origen en SQS, puedes configurar:
- El número máximo de recepciones (por ejemplo, 5), y
- Una dead-letter queue a la que enviar los mensajes fallidos.
Cuando:
- Un mensaje de la cola origen se recibe (vía
ReceiveMessage) cierto número de veces - Pero nunca se borra (es decir, sigue fallando),
se moverá automáticamente a la DLQ.
Los mensajes acumulados en la DLQ pueden:
- Investigarse y reprocesarse en un lote separado,
- Corregirse manualmente y reenviarse, etc.,
permitiendo una gestión con intervención humana de los mensajes problemáticos.
GCP Pub/Sub dispone de dead-letter topics, y Azure Service Bus tiene también dead-letter queues.
Todos comparten la misma idea: “Proporcionar un aparcamiento seguro para los mensajes que no pueden gestionarse automáticamente.”
5. Relación entre SQS y SNS/EventBridge: colas vs Pub/Sub
5.1 SQS: mensajería punto a punto (1:1)
SQS es esencialmente:
- Una cola,
- Múltiples consumidores, pero cada mensaje lo procesa exactamente un consumidor.
Este es el modelo de mensajería punto a punto (Point-to-Point).
5.2 SNS: servicio de notificaciones Pub/Sub (1 a muchos)
Amazon SNS (Simple Notification Service) es un servicio de notificaciones de tipo publish/subscribe.
- Cuando se publica un mensaje en un topic,
- Se entrega simultáneamente a múltiples suscriptores (colas SQS, Lambda, endpoints HTTP, correo electrónico, etc.).
Combinando SNS y SQS obtienes:
- Topics SNS (el “hub” de eventos), y
- Colas SQS (los “buzones” de cada sistema).
Esto permite que múltiples sistemas procesen de forma asíncrona el mismo evento.
5.3 EventBridge: un “bus de eventos” evolucionado
AWS EventBridge es un “bus de eventos” que proporciona enrutamiento y filtrado más avanzados.
- Recibe eventos de numerosos servicios de AWS y de proveedores SaaS,
- Y los enruta en función de reglas hacia:
- SQS / SNS
- Lambda / Step Functions
- EC2 / ECS / API Gateway, etc.
GCP tiene Cloud Pub/Sub, y Azure tiene Event Grid + Service Bus/Queues,
todos compartiendo la idea de “reunir los eventos en un único lugar y enrutararlos a los destinos adecuados.”
6. Uso práctico en microservicios y procesamiento por lotes
6.1 Frontend web + procesamiento en segundo plano
Un patrón clásico es API Gateway + Lambda / ECS + SQS:
- La API recibe las peticiones de los usuarios (por ejemplo, confirmación de pedido).
- Devuelve inmediatamente una respuesta (“Hemos recibido tu pedido”).
- El trabajo pesado (cobro, comprobación de inventario, envío de correos, etc.) se coloca como mensajes en una cola SQS.
- Los workers en segundo plano (Lambda / ECS) procesan estos mensajes de forma asíncrona.
Este patrón permite:
- Tiempos de respuesta cortos para los usuarios, y
- Manejar picos de carga almacenando mensajes en la cola y procesándolos poco a poco,
logrando un buen equilibrio entre velocidad de respuesta y escalabilidad.
En GCP puedes hacer lo mismo con Cloud Tasks o Cloud Pub/Sub,
y en Azure, con Storage Queues / Service Bus + Functions.
6.2 Buffer para pipelines de datos
Ejemplo de patrón:
- Se sube un archivo a S3.
- Una función Lambda se dispara y envía a SQS los metadatos del archivo.
- Varios workers (tareas por lotes en ECS/EKS) extraen mensajes de SQS y procesan los archivos.
Esto te da suavizado del procesamiento de archivos y facilidad para reprocesar.
En flujos de big data, a menudo se ve GCP Pub/Sub → Dataflow,
o Azure Event Hubs / Service Bus → Data Factory.
La idea de fondo es la misma.
6.3 Reintentos y backoff
Con los visibility timeouts de SQS y las DLQs, puedes implementar una estrategia de reintentos escalonada, como:
- 1.er intento: reintento inmediato (visibility timeout corto).
- 2.º–3.er intentos: aplicar backoff (el consumidor espera antes de reenviar / usa otra cola para reintentos diferidos).
- A partir del 4.º intento: enviar a la DLQ e involucrar a una persona.
Definir estas políticas de antemano hace que el comportamiento del sistema sea mucho más claro durante fallos.
7. Diseño de mensajes: esquema, tamaño e idempotencia
7.1 Diseño de esquemas de mensajes
El cuerpo del mensaje SQS es texto libre (normalmente JSON).
La preocupación clave de diseño es:
- Qué incluir en el mensaje.
Enfoques habituales:
- Patrón “solo ID”
- Ejemplo:
{"order_id": "12345"} - Todos los detalles se recuperan de otro almacén de datos (RDS / DynamoDB, etc.).
- Más fácil mantener el tamaño del mensaje pequeño.
- Ejemplo:
- Patrón “incluir todos los detalles”
- Ejemplo: incluir datos del pedido, del usuario, del producto, etc., como un documento JSON completo.
- Menos consultas a la BD, pero el tamaño del mensaje crece con facilidad.
No hay una única respuesta correcta; tienes que considerar frecuencia de actualización, consistencia de datos y límites (SQS máx. 256 KB).
7.2 Idempotencia
SQS, GCP Pub/Sub y Azure Service Bus obligan a asumir que:
- El mismo mensaje puede procesarse más de una vez sin causar problemas.
Por ejemplo:
- Registrar en una BD si un
order_idya se ha procesado. - Usar APIs externas (por ejemplo, de pago) que admitan reenviar peticiones con el mismo ID de solicitud sin cobrar dos veces.
- Usar UPSERT en lugar de un INSERT simple para evitar errores al insertar dos veces la misma fila.
Estos patrones permiten escalar de forma segura un sistema que depende fuertemente de colas.
8. Comparando GCP Pub/Sub y Azure Service Bus
8.1 Cloud Pub/Sub (GCP)
- Fundamentalmente un modelo Pub/Sub.
- Publicar en un topic → múltiples suscripciones reciben mensajes vía pull o push.
- Alto rendimiento; adecuado para cargas orientadas a eventos y streaming.
- Ofrece dead-letter topics, claves de ordenación y garantías cada vez más fuertes similares al “exactly-once”.
Dado que su núcleo es Pub/Sub,
Cloud Pub/Sub suele encajar de forma más natural que una simple SQS
cuando varios consumidores deben procesar el mismo mensaje.
8.2 Azure Service Bus / Storage Queues
- Azure Service Bus
- Colas + topics + suscripciones.
- Muy rico en funcionalidades (sesiones, transacciones, entrega programada, etc.).
- Muy orientado al espacio de “mensajería empresarial”.
- Azure Storage Queues
- Servicio de colas más simple y barato.
- Sensación similar a SQS; bueno para trabajos sencillos en segundo plano y buffering.
En cuanto a funcionalidades, SQS se parece más a Storage Queues por su simplicidad,
pero combinada con SNS / EventBridge / Lambda / ECS/EKS,
puedes construir arquitecturas parecidas a Service Bus con topics y suscripciones.
9. Checklist de diseño práctico (qué decidir en las primeras 1–2 semanas)
- Dónde pasar de API síncrona a SQS
- Mantén rápida la parte de cara al usuario; mueve el procesamiento pesado a asíncrono.
- Selección de tipo de cola: Standard vs FIFO
- ¿Qué tan crítico es el orden?
- ¿Es realmente inaceptable si el procesamiento ocurre dos veces?
- Estructura del mensaje (esquema)
- ¿Solo ID, o incluir detalles?
- Cómo gestionar el versionado (por ejemplo,
"schema_version": "v1")
- Relación entre visibility timeout y tiempo de procesamiento
- Basarlo en el tiempo de procesamiento típico + margen.
- DLQ y número máximo de recepciones (max receive count)
- ¿Tras cuántos fallos debe intervenir una persona?
- Estrategia de reintentos
- Cómo implementar backoff y volver a encolar desde el lado del consumidor.
- Métricas y alertas
- Longitud de la cola (ApproximateNumberOfMessages)
- Número de mensajes en la DLQ
- Latencia extremo a extremo (desde el productor hasta la finalización del consumidor)
- Multinube y expansión futura
- Si más adelante migras a Pub/Sub o Service Bus,
¿podrás reutilizar tal cual tu estructura de mensajes y patrones?
- Si más adelante migras a Pub/Sub o Service Bus,
10. ¿Quién se beneficia y cómo? (Valor concreto por rol)
10.1 Desarrolladores backend
- Cuando piensas, “Quiero respuestas rápidas, pero los procesos de backend son pesados…”,
naturalmente considerarás:“Vamos a poner todo lo que viene a partir de aquí en una cola SQS y que un worker se encargue.”
- A medida que tu servicio crece y el tráfico aumenta, SQS actúa como buffer,
de modo que tu arquitectura suele envejecer de forma más saludable.
10.2 Microservicios / SRE / ingenieros de plataforma
- En lugar de acoplar fuertemente los servicios con llamadas HTTP síncronas, puedes
acoplarlos débilmente usando eventos y colas, lo que permite:- Arquitecturas en las que las caídas de un servicio no se propagan por todo el sistema,
- “Válvulas” que ayudan a tu sistema a sobrevivir a ralentizaciones.
- Si entiendes SQS / SNS / EventBridge, GCP Pub/Sub y Azure Service Bus lado a lado,
adquieres la capacidad de aplicar los mismos patrones de mensajería incluso cuando cambias de nube.
10.3 Ingenieros de procesamiento por lotes y de plataformas de datos
- Con SQS encolando un gran número de trabajos o tareas de datos, puedes controlar:
- “Número de mensajes procesados por minuto”, y
- “Número de workers concurrentes”,
lo que facilita afinar el rendimiento.
- Esto te permite regular suavemente la carga sobre BDs downstream y APIs externas.
10.4 Tech leads, arquitectos y CTOs
- Puedes conceptualizar tu sistema en tres capas:
- Capa central de APIs síncronas (API Gateway / Load Balancer),
- Capa de mensajería asíncrona (SQS / SNS / EventBridge / Pub/Sub / Service Bus),
- Capa de procesamiento por lotes / workers / datos.
Esto ayuda a diseñar arquitecturas resistentes al crecimiento futuro de carga y a la descomposición de servicios.
11. Tres cosas que puedes empezar a hacer hoy
- Identificar un proceso que podría ser asíncrono en tu sistema actual.
- Ejemplos: envío de correos, generación de PDFs, agregación de informes, conversión de imágenes, etc.
- Dibujar un diagrama sencillo que separe ese proceso en SQS + worker
- Productor → SQS → Consumidor (Lambda / ECS).
- Construir un pequeño PoC
- Si tienes una cuenta de AWS, crea una cola Standard y:
- Una función Lambda que envíe mensajes, y
- Una función Lambda que procese mensajes (disparada mediante un event source mapping de SQS).
- Si tienes una cuenta de AWS, crea una cola Standard y:
Rápidamente obtendrás una sensación intuitiva de cómo se comporta.
Si pruebas lo mismo con GCP Pub/Sub + Cloud Functions o Azure Storage Queue + Functions,
verás de primera mano que “la forma de pensar el diseño de mensajería es común entre nubes.”
12. Conclusión: SQS como capa clave para suavizar “tiempo y carga”
Amazon SQS es:
- Una cola de mensajes que conecta débilmente emisores y receptores,
- Un buffer que absorbe picos y admite reintentos y gestión de errores durante fallos, y
- En arquitecturas de microservicios y serverless, un componente que suaviza el “eje temporal”.
Cloud Pub/Sub de GCP y Service Bus / Storage Queues de Azure
son pares que ayudan a materializar el mismo “mundo conectado por mensajes”.
Lo importante es:
- No intentes hacerlo todo con HTTP síncrono.
- Estate dispuesto a delegar responsabilidad en la capa de mensajería.
- Diseña tolerando duplicados, reordenación y mensajes fallidos.
Introduciendo poco a poco SQS (o Pub/Sub / Service Bus)
empezando por pequeñas funcionalidades,
tu sistema irá evolucionando lentamente hasta convertirse en uno
“más robusto, más escalable y más fácil de cambiar en el futuro.”
Sin prisas, revisa cada proceso uno por uno, preguntándote:
“¿Debería esto ser síncrono o asíncrono?” “¿Debería pasar esto por una cola?”
Y paso a paso, vayamos construyendo un diseño de mensajería que encaje perfectamente con tu servicio.
