AWS SQS

¿Qué es una cola? Es un mecanismo que permite que haya emisores de mensajes o datos que se quedan almacenados en esa cola, hasta que otros consumidores accedan a esos datos para utilizarlos como corresponda, es decir que recojan esos mensajes de la cola:

SQS es una implementación de este servicio de colas, y ofrece varias implementaciones diferentes:

  • Standard Queue:
    • Totalmente gestionado por AWS
    • Escalabilidad hasta 10.000 mensajes por segundo
    • Retención de mensajes por defecto, 4 días. Máximo 14 días.
    • No hay limitación de número de mensajes en la cola
    • Baja latencia (menos de 10ms en escritura y lectura)
    • Escalado horizontal en número de consumidores
    • Puede haber mensajes duplicados (al menos una entrega)
    • Puede haber mensajes desordenados (best effort ordering)
    • Tamaño máximo de mensaje: 256KB
  • Delay Queue:
    • Retrasa cada mensaje hasta 15 minutos, los consumidores no lo ven inmediatamente
    • Por defecto, se retrasa 0 segundos, pero se puede definir el valor por defecto en la cola.
    • Se puede sobreescribir el valor por defecto, con el parámetro DelaySeconds
  • Dead Letter Queue:
    • Cuando un mensaje no se procesa en el intervalo del Visibility Timeout (ver después), el mensaje vuelve a la cola para ser leído por otro consumidor.
    • Podemos definir un número máximo de veces que un mensaje puede volver a la cola por superar el Visibility Timeout, llamado «Redrive Policy».
    • Cuando un mensaje supera ese límite, el mensaje se elimina de la cola y se envía a otra cola, de tipo DLQ (Dead Letter Queue). Esta DLQ debe ser creada previamente y marcada como de tipo DLQ.
    • Después de lo anterior, debería haber consumidores del DLQ para que sus mensajes no expiren en esa cola.
  • FIFO Queue:
    • No está disponible en todas las regiones
    • El nombre de la cola debe acabar en .fifo
    • Menor throughput, hasta 3000 mensajes por segundo con procesado por lotes, y 300 sin él.
    • Los mensajes son consumidos en el mismo orden que se entregan, no hay posibilidad de desorden de mensajes.
    • Se asegura que los mensajes no se dupliquen
    • No hay posibilidad de añadir retraso por mensaje, solo por cola
    • Grupos de mensaje: posibilidad de agrupar mensajes con un Message GroupID, que es una etiqueta más en el mensaje, y obliga que un solo consumidor procese estos mensajes, así se asegura el orden de procesamiento.

Visibility Timeout

Cuando un consumidor realiza una operación de lectura de mensajes de la cola, puede recibir hasta un máximo de 10 mensajes al mismo tiempo. Este consumidor procesará cada mensaje y enviará una solicitud a la cola para eliminar ese mensaje, con el ID de cada mensaje.

Desde que un consumir lee un mensaje, tiene un periodo de tiempo (Visibility Timeout) en el que ese mensaje sigue existiendo en la cola pero es invisible para otros consumidores. Este Timeout puede ser configurado entre 0 segundos a 12 horas (por defecto 30 segundos).

Dos operaciones de la API de SQS importantes:

  • ChangeMessageVisibility: para cambiar la visibilidad mientras se procesa un mensaje
  • DeleteMessage: para indicar a la cola que el mensaje se ha procesdo correctamente, y puede ser borrado.

Long Polling

Cuando un consumidor hace una operación de lectura (poll) sobre la cola SQS y no hay mensajes disponibles, puede terminar esa operación o quedarse esperando a que haya algún mensaje disponible. Esa segunda opción es la denominada Long Polling, y se recomienda porque reduce el número de llamadas al API de SQS, y mejora la latencia y eficiencia del consumidor.

El tiempo de espera puede configurarse entre 1 y 20 segundos, aunque este último valor es el más recomendado. El Long Polling es el preferido con respecto al Short Polling.

Puede habilitarse a nivel de cola SQS, o a través del API mediante la llamada WaitTimeSeconds.

SQS con Auto Escaling Group

Se puede integrar un sistema de autoescalado de instancias EC2 con un sistema de colas SQS, cuando los consumidores sean estas instancias de EC2. Lo que nos permitiría es aumentar o disminuir el número de instancias basado en la cantidad de mensajes acumulados en SQS, de forma el número de instancias en ejecución sea proporcional al número de mensajes pendientes de procesar. Para ello:

  1. Crear una métrica en CloudWatch basada en la longitud de la cola
  2. Esta métrica de CloudWatch generará una Alarma al alcanzar los umbrales definidos
  3. Esta Alarma, será el mecanismo que permite que el ASG tome decisiones para aumentar o disminuir el número de instancias EC2 disponibles

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.