1. Decide primero quién inicia la entrega#
La diferencia más importante entre colas no es el precio: es quién abre la conexión. En un modelo pull, tus workers piden mensajes cuando tienen capacidad y confirman cada uno al terminar. En un modelo push, el servicio llama a tu código, normalmente por HTTP, y considera el mensaje entregado cuando respondes con éxito.
- AWS SQS es pull: tus consumidores llaman a ReceiveMessage y después a DeleteMessage. Con long polling, la llamada espera hasta 20 segundos a que haya mensajes, lo que reduce respuestas vacías y costo.
- Cloudflare Queues ofrece ambos: un consumidor Worker recibe lotes en modo push, o un consumidor pull los pide por HTTP desde cualquier entorno fuera de Workers, con un token de API y un visibility timeout de 30 segundos por defecto y hasta 12 horas.
- Upstash QStash es push: envía una petición HTTP a tu endpoint con el cuerpo sin modificar y una firma en el encabezado Upstash-Signature que debes verificar.
Pull encaja cuando tus workers son procesos de larga duración, necesitas controlar la presión sobre una base de datos o quieres escalar consumidores por backlog. Push encaja con funciones serverless o endpoints HTTP existentes que no deberían mantener un bucle de polling. El costo de un modelo push incluye mantener un endpoint público, autenticado y capaz de responder a tiempo.
Documentación: AWS: short y long polling en SQS ↗ · Cloudflare: consumidores pull ↗ · Upstash: recibir mensajes de QStash ↗
2. Garantías de entrega: al menos una vez, orden y deduplicación#
Las tres opciones pueden entregarte un mensaje más de una vez. SQS Standard documenta entrega al menos una vez: si un servidor que guarda una copia no está disponible al borrar, esa copia puede volver. Cloudflare Queues también declara entrega al menos una vez y advierte que, en raras ocasiones, un mensaje puede entregarse más de una vez. En QStash, cualquier respuesta sin estado 2XX dispara un reintento, así que un endpoint que procesó pero respondió tarde o con error recibirá el mensaje otra vez.
El orden es otra decisión. SQS Standard intenta conservar el orden de envío, pero los mensajes pueden llegar ocasionalmente fuera de orden. SQS FIFO preserva el orden dentro de cada grupo de mensajes y no introduce duplicados en la cola cuando repites SendMessage dentro de un intervalo de deduplicación de 5 minutos, usando un MessageDeduplicationId o deduplicación por contenido con SHA-256 del cuerpo. QStash ofrece colas con entrega FIFO de uno en uno y una deduplicación de 10 minutos por Upstash-Deduplication-Id o por contenido. La documentación de garantías de Cloudflare Queues no promete orden.
Ninguna de estas ventanas sustituye la idempotencia del consumidor: deduplican publicaciones cercanas, no efectos de negocio. La guía de colas, reintentos e idempotencia explica cómo diseñar esa parte; aquí basta con saber que vas a necesitarla con cualquier proveedor.
Para profundizar: Colas, reintentos e idempotencia: evita procesar dos veces
Documentación: AWS: entrega al menos una vez en SQS ↗ · AWS: orden en colas Standard ↗ · AWS: colas FIFO ↗ · AWS: deduplicación en FIFO ↗ · Cloudflare: garantías de entrega de Queues ↗ · Upstash: colas FIFO de QStash ↗ · Upstash: deduplicación en QStash ↗ · Upstash: reintentos de QStash ↗
3. Retención, tamaño, demora y throughput#
Los límites operativos descartan opciones antes que el precio. Un payload de 500 KB no cabe en Cloudflare Queues; un trabajo programado para dentro de una semana no cabe en la demora de SQS; una ráfaga ordenada muy grande puede chocar con el throughput de FIFO.
| Límite | SQS Standard / FIFO | Cloudflare Queues (Paid) | QStash Pay as You Go |
|---|---|---|---|
| Retención en cola | 4 días por defecto; de 1 minuto a 14 días | 4 días por defecto; configurable hasta 14 | No publica retención de cola; DLQ de 7 días |
| Tamaño máximo | 1 MiB; más grande con Extended Client y S3 | 128 KB por mensaje | 10 MB por mensaje |
| Demora máxima | 15 minutos | 24 horas (delaySeconds) | 1 año |
| Throughput | Standard casi ilimitado; FIFO 300 TPS por partición sin modo alto | 5.000 mensajes por segundo por cola | Paralelismo máximo de 100 |
| Reintentos | Visibility timeout de 30 s por defecto, hasta 12 h | 3 por defecto, máximo 100; luego DLQ o descarte | 3 por defecto, configurable con Upstash-Retries |
En Cloudflare Queues, un mensaje que agota sus reintentos se borra de la cola, salvo que configures una cola de mensajes fallidos. En QStash, la espera entre reintentos crece de forma exponencial hasta un máximo de un día. En SQS, el mensaje reaparece cuando vence su visibility timeout, así que ese valor debe cubrir tu tiempo real de procesamiento.
La retención es un amortiguador para incidentes: si tu consumidor cae un fin de semana largo, 4 días por defecto pueden no alcanzar. Configúrala a propósito y alerta por la antigüedad del mensaje más viejo, no solo por el tamaño del backlog.
Documentación: AWS: cuotas de mensajes de SQS ↗ · Cloudflare: límites de Queues ↗ · Cloudflare: batching y reintentos ↗ · Upstash: plan Pay as You Go ↗ · Upstash: reintentos de QStash ↗
4. Entiende la unidad que te cobran#
Cada proveedor cobra una unidad distinta y ninguna es exactamente un mensaje. Por eso el comparador de colas de Codifly modela un escenario común: 1 millón de mensajes de 1 KiB a un consumidor, sin lotes, reintentos ni cuotas gratis.
- SQS cobra por solicitud: en us-east-1, $0,40 por millón en Standard y $0,50 por millón en FIFO en el primer tramo, con 1 millón de solicitudes gratis al mes. Toda acción cuenta, incluidas ReceiveMessage, DeleteMessage y ChangeMessageVisibility. Cada bloque de 64 KB del payload cuenta como una solicitud: una acción con 1 MiB se factura como 16. Un lote de hasta 10 mensajes cuenta como una sola solicitud.
- Cloudflare Queues cobra $0,40 por millón de operaciones en Workers Paid, con 1 millón incluido al mes. Cuenta una operación por cada 64 KB escritos, leídos o borrados, y cada reintento suma una lectura. No cobra egress ni ancho de banda, pero el plan Workers Paid y la ejecución de tus Workers se pagan aparte.
- QStash cobra $1 por cada 100.000 mensajes, donde un intento de entrega a un endpoint cuenta como un mensaje. Un reintento es otro intento, y publicar en un topic se cobra una vez por cada endpoint suscrito. Incluye 50 GB de transferencia al mes; el excedente cuesta $0,05 por GB.
En el escenario de referencia del comparador, un mensaje en SQS o Cloudflare implica tres llamadas: enviar, leer y borrar. Eso da $1,20 por millón de mensajes en SQS Standard y en Cloudflare Queues, $1,50 en SQS FIFO y $10 en QStash. La diferencia de QStash compra algo: no operas workers de polling y obtienes demoras largas. El precio no incluye la ejecución del consumidor en ninguno de los casos.
Documentación: AWS: reglas de facturación de SQS ↗ · AWS: lista de precios de SQS en us-east-1 ↗ · Cloudflare: precios de Queues ↗ · Upstash: precios de QStash ↗
5. Ejemplo: cómo los reintentos y los lotes mueven la factura#
Supuestos: 10 millones de mensajes de 1 KiB al mes, un consumidor, y un 5 % de mensajes (500.000) que fallan una vez y se reintentan una vez. Restamos la cuota gratuita de cada proveedor y no incluimos cómputo, planes base ni transferencia.
SQS Standard, sin lotes
envío 10 M + recepción (10 M + 0,5 M) + borrado 10 M = 30,5 M solicitudes
(30,5 M − 1 M gratis) × $0,40 por M = $11,80
SQS FIFO, sin lotes
(30,5 M − 1 M gratis) × $0,50 por M = $14,75
SQS Standard, lotes completos de 10
1 M + (1 M + 0,05 M) + 1 M = 3,05 M solicitudes
(3,05 M − 1 M gratis) × $0,40 por M = $0,82
Cloudflare Queues
escritura 10 M + lectura (10 M + 0,5 M) + borrado 10 M = 30,5 M operaciones
(30,5 M − 1 M incluidas) × $0,40 por M = $11,80
QStash
10 M intentos + 0,5 M reintentos = 10,5 M intentos
10,5 M / 100.000 × $1 = $105,00
con 2 endpoints suscritos a un topic: × 2 = $210,00Tres lecciones salen de estas cuentas. Primera, en SQS los lotes reducen el costo casi diez veces porque la unidad es la solicitud, no el mensaje. Segunda, Cloudflare aclara que las operaciones son por mensaje, no por lote: un lote de 10 genera 10 escrituras, 10 lecturas y 10 borrados. Tercera, en QStash cada reintento y cada destino adicional es un mensaje facturado: una dependencia caída que devuelve 500 durante horas se convierte en gasto directo.
El tamaño también multiplica. Con mensajes de 100 KB, cada acción de SQS y cada lectura o escritura de Cloudflare pasa a contar como dos bloques de 64 KB. En SQS, el polling corto con la cola vacía genera solicitudes facturadas sin mensajes; usa long polling. Y en SQS, cada ChangeMessageVisibility para extender un trabajo largo es otra solicitud.
Documentación: AWS: reglas de facturación de SQS ↗ · AWS: lista de precios de SQS en us-east-1 ↗ · Cloudflare: precios de Queues ↗ · Upstash: precios de QStash ↗
6. Qué opción encaja con cada caso#
| Si necesitas | Mejor punto de partida | Por qué |
|---|---|---|
| Workers propios en AWS y mucho volumen | SQS Standard | Pull con lotes de 10 y long polling; costo por mensaje muy bajo. |
| Orden estricto por cliente o entidad | SQS FIFO | Orden por grupo de mensajes y deduplicación de 5 minutos al publicar. |
| Productores y consumidores en Workers | Cloudflare Queues | Consumo push integrado, sin egress y con reintentos y DLQ configurables. |
| Llamar endpoints HTTP o funciones serverless | QStash | Push HTTP con firma, reintentos y demoras de hasta 1 año sin mantener workers. |
| Payloads grandes | Guardar el archivo en storage y encolar la referencia | Evitas límites de 128 KB o 1 MiB y bloques facturados de 64 KB. |
Si ya operas en una nube, la integración con su identidad, red y observabilidad suele pesar más que unos centavos por millón. Cambiar de cola más adelante es posible, pero toca productores, consumidores, alertas y el manejo de mensajes fallidos.
7. Checklist para elegir cola#
- Define si tu consumidor puede sostener polling o si necesita recibir llamadas HTTP.
- Confirma que tu consumidor es idempotente: todas las opciones pueden entregar duplicados.
- Decide si necesitas orden y a qué nivel: global, por entidad o ninguno.
- Compara tu payload más grande con el límite de tamaño y con los bloques de 64 KB.
- Revisa la demora máxima si programas trabajos a futuro.
- Configura retención, DLQ y alertas por antigüedad del mensaje más viejo.
- Calcula el costo con tu tasa real de fallos, número de destinos y tamaño de lote.
- Suma lo que la cola no cobra: cómputo del consumidor, plan base y transferencia.
- Verifica las tarifas en la página oficial del proveedor antes de decidir.
El comparador de colas de Codifly resume estas cifras con sus supuestos; ajusta el escenario con tu volumen y tus reintentos antes de compararlas.
Fuentes y alcance
Documentación consultada el 26 de septiembre de 2026. Los ejemplos y criterios de decisión son propuestas editoriales; adáptalos al contrato de tu aplicación y valídalos en tu entorno de pruebas autorizado.
- AWS: short y long polling en SQS ↗
- Cloudflare: consumidores pull ↗
- Upstash: recibir mensajes de QStash ↗
- AWS: entrega al menos una vez en SQS ↗
- AWS: orden en colas Standard ↗
- AWS: colas FIFO ↗
- AWS: deduplicación en FIFO ↗
- Cloudflare: garantías de entrega de Queues ↗
- Upstash: colas FIFO de QStash ↗
- Upstash: deduplicación en QStash ↗
- Upstash: reintentos de QStash ↗
- AWS: cuotas de mensajes de SQS ↗
- Cloudflare: límites de Queues ↗
- Cloudflare: batching y reintentos ↗
- Upstash: precios de QStash ↗
- AWS: reglas de facturación de SQS ↗
- AWS: lista de precios de SQS en us-east-1 ↗
- Cloudflare: precios de Queues ↗
Compara colas de mensajes
Revisa tarifas, límites, condiciones y fuentes de cada opción.
Abrir comparador