aws.crafter.run

SQS

Amazon Simple Queue Service

Un buzón gestionado con una regla que sorprende a todo el mundo: leer un mensaje no lo borra, solo lo esconde durante un rato.

Verificado el

Los tres conceptos

Si no entiendes estos tres, nada de lo demás encaja.

  1. 1

    Visibility timeout

    Recibir un mensaje no lo saca de la cola: lo oculta durante un tiempo (30 segundos por defecto). Si no lo borras antes de que expire, reaparece y otro consumidor lo procesa. Casi todos los bugs raros de SQS son este reloj mal ajustado.

  2. 2

    El consumidor tira, y el consumidor borra

    La cola no empuja nada: alguien pregunta. Y el ciclo tiene tres pasos, no dos — recibir, procesar y **borrar**. Si tu código se salta el tercero o lo hace en el orden equivocado, o duplicas trabajo o pierdes mensajes.

  3. 3

    Estándar o FIFO

    Estándar da throughput casi ilimitado a cambio de duplicados y desorden. FIFO da orden por grupo de mensajes y deduplicación a cambio de mucho menos throughput. No hay una tercera opción, y elegir mal es caro de deshacer.

Los límites

Hard es un muro: no se sube ni con un ticket. Soft se amplía pidiéndolo — antes del pico, no durante.

ConceptoValorTipo
Tamaño de mensajeCuatro veces lo que admite SNS. Si publicas vía SNS, el techo real son sus 256 KiB. Con las Extended Client Libraries el payload sube a 2 GB vía S3.1 048 576 bytes (1 MiB)hard
Mensajes por loteAplica a SendMessageBatch, ReceiveMessage y DeleteMessageBatch.10hard
Atributos por mensaje10hard
Visibility timeout30 s por defecto · máximo 12 hhard
Retención de mensajesLos 14 días no se amplían. Pasado ese plazo el mensaje se borra sin avisar a nadie.4 días por defecto · de 60 s a 14 díashard
Retraso de entregaPara esperas más largas necesitas Step Functions o EventBridge Scheduler.máximo 15 minutoshard
Espera de long pollingmáximo 20 segundoshard
Mensajes en vuelo — estándarRecibidos y aún sin borrar. Se llega a este techo cuando los consumidores van más lentos que el productor, y con short polling devuelve OverLimit.~120 000soft
Mensajes almacenados en la colaEl backlog no tiene techo. Lo que tiene techo es lo que está en vuelo.ilimitadosoft
FIFO sin alto rendimiento300 TPS por acción · 3 000 msg/s con lotessoft
FIFO con alto rendimientoCon lotes de 10 sube a 700 000 msg/s en las tres regiones grandes y a 24 000 en las demás.70 000 TPS en us-east-1, us-west-2 y eu-west-1 · 2 400 TPS en el restosoft
Política de recursos de la cola8 192 bytes · 20 sentenciashard
Longitud del nombre de cola80 caractereshard

Modelo mental

Si SNS es un altavoz, SQS es un buzón. Guarda lo que le echas hasta que alguien viene a recogerlo, y el backlog no tiene techo: puedes acumular millones de mensajes sin que la cola se inmute.

Pero tiene una regla que descoloca a todo el mundo la primera vez:

Recibir un mensaje no lo borra. Lo esconde.

Cuando llamas a ReceiveMessage, SQS te entrega el mensaje y arranca un cronómetro —el visibility timeout, 30 segundos por defecto— durante el cual ese mensaje es invisible para los demás consumidores. Tienes ese rato para procesarlo y llamar a DeleteMessage. Si no lo haces, el cronómetro expira, el mensaje reaparece en la cola y otro consumidor lo coge.

Ese diseño es deliberado y es lo que hace a SQS fiable: si tu consumidor muere a mitad de proceso, nadie tiene que enterarse ni avisar a nadie. El mensaje vuelve solo. El precio es que el borrado es responsabilidad tuya y que el reloj hay que ajustarlo a mano.

El ciclo, entonces, tiene tres pasos y no dos:

  1. ReceiveMessage — el mensaje se oculta
  2. tu código hace el trabajo
  3. DeleteMessage — ahora sí desaparece

Con Lambda, el event source mapping hace el 1 y el 3 por ti: borra el mensaje si tu función termina sin lanzar. Es cómodo y es también la razón por la que mucha gente lleva años usando SQS sin saber que el visibility timeout existe — hasta el día que su función tarda más de lo previsto.

La cola no empuja: alguien pregunta. Por defecto ese sondeo es short polling, que responde al instante aunque no haya nada. Casi siempre quieres long polling (WaitTimeSeconds hasta 20 segundos): menos respuestas vacías, menos latencia y menos factura.

Cómo te factura

Se paga por peticiones, no por mensajes ni por almacenamiento:

Concepto Precio aproximado
Colas estándar ~0,40 USD / millón de peticiones
Colas FIFO algo más caro por petición
Primer millón de peticiones al mes gratis
Guardar mensajes en la cola sin coste

Dos reglas mueven la factura mucho más que el precio unitario:

Cada porción de 64 KB cuenta como una petición. La documentación de precios es explícita: una acción con un payload de 1 MiB se factura como 16 peticiones. Mandar el hecho y una referencia a S3 en vez del documento entero no es solo más limpio, es dieciséis veces más barato.

El sondeo también factura, haya mensajes o no. Una cola vacía conectada a una Lambda genera peticiones ReceiveMessage las veinticuatro horas. No arruina a nadie, pero explica la línea de SQS cuando el sistema “no está haciendo nada”. Long polling con 20 segundos reduce ese goteo a la vigésima parte de lo que costaría sondeando cada segundo.

Y una que ahorra de verdad: los lotes. Diez mensajes en una llamada son una petición, no diez. Si controlas el productor, batear es la optimización más rentable que vas a hacer aquí.

Cuándo NO usarlo

Errores comunes

El visibility timeout más corto que el proceso. Es el error número uno y no falla ruidosamente: falla duplicando trabajo. Tu función tarda 45 segundos, el timeout son 30, así que a los 30 el mensaje reaparece y un segundo consumidor empieza a procesarlo mientras el primero sigue vivo. Ahora tienes dos cobros, dos emails, dos de lo que sea. Con Lambda, el visibility timeout tiene que estar cómodamente por encima del timeout de la función, no ajustado.

No activar reportBatchItemFailures. Sin eso, si un mensaje de un lote de diez falla, los diez vuelven a la cola y los nueve buenos se reprocesan. Un solo mensaje venenoso puede tener a tu función dando vueltas indefinidamente.

No poner DLQ. Sin redrivePolicy, un mensaje que siempre falla se reintenta hasta agotar la retención — hasta 14 días de invocaciones que siempre fallan, que sí se facturan.

Quedarse en short polling. Es el valor por defecto y casi nunca es lo que quieres: más respuestas vacías, más latencia percibida y más peticiones.

Asumir orden en una cola estándar. La documentación dice literalmente que los mensajes “pueden llegar desordenados”. Si tu lógica depende del orden de llegada, funcionará en desarrollo y fallará en producción bajo carga.

Olvidar que hay un techo de mensajes en vuelo. Unos 120 000 en colas estándar. No se llega procesando rápido: se llega cuando los consumidores no dan abasto y todo se queda recibido y sin borrar.

Fuentes

Cuotas de mensajes, tamaños, visibility timeout y throughput FIFO: Amazon SQS message quotas. Mensajes en vuelo, long polling y retrasos: Amazon SQS standard queue quotas. Garantías de entrega y desorden: Amazon SQS standard queues. Regla de facturación por porciones de 64 KB: SQS pricing. Los importes concretos proceden de la página de precios de AWS, que se renderiza dinámicamente y no pudo citarse literalmente: trátalos como orden de magnitud.

Dónde aparece esto