Amazon Simple Queue Service (Amazon SQS) es un servicio de colas de mensajes que permite enviar y recibir mensajes entre componentes de una aplicación de forma fiable y duradera. Con Amazon SQS, se puede desacoplar la lógica de negocio de la fuente de los eventos, y procesarlos de forma asíncrona y en paralelo.
En este artículo, vamos a ver cómo usar Lambda con Amazon SQS para procesar mensajes de una cola de forma eficiente y flexible, aprovechando las características de concurrencia, escalamiento y procesamiento del event source mapping de Lambda, así como la estrategia de backoff que implementa Lambda para manejar errores y reintentos.
Concurrencia del event source mapping
Un event source mapping es una configuración que le dice a Lambda qué fuente de eventos debe monitorear y qué función debe invocar cuando se produzca un evento. En el caso de Amazon SQS, el event source mapping se encarga de leer los mensajes de la cola y enviarlos a la función Lambda en lotes.
La concurrencia del event source mapping es el número máximo de instancias de la función Lambda que el event source mapping puede invocar simultáneamente. Este valor se puede configurar para limitar el consumo de recursos y evitar la sobrecarga de la función o de otros servicios.
Para las colas estándar la concurrencia del event source mapping puede llegar hasta 1.000, lo que significa que se pueden procesar hasta 1.000 lotes de mensajes al mismo tiempo. Para las colas FIFO, que sí garantizan el orden y la unicidad de los mensajes, la concurrencia del event source mapping está limitada por el número de grupos de mensajes que tenga la cola, ya que cada grupo se procesa de forma secuencial.
Escalamiento y procesamiento del event source mapping
El event source mapping de Lambda utiliza un algoritmo de escalamiento y procesamiento para optimizar el rendimiento y la eficiencia de la función Lambda. Este algoritmo se basa principalmente en los siguientes parámetros:
- Batch Window, que es el tiempo máximo que el event source mapping espera para llenar un lote antes de invocar la función Lambda. Por defecto, es 0, lo que significa que se invoca la función tan pronto como hay mensajes disponibles, pero se puede configurar hasta 300 segundos para las colas estándar.
- Payload Size, que es el tamaño máximo de los datos que se envían a la función Lambda en cada invocación. El límite es de 6 MB para las invocaciones síncronas, y se debe tener en cuenta que los mensajes de Amazon SQS incluyen metadatos adicionales que también cuentan para el tamaño del payload.
- Batch Size, que es el número máximo de mensajes que se envían a la función Lambda en cada invocación. Por defecto, es 10, pero se puede configurar hasta 10.000 para las colas estándar y hasta 10 para las colas FIFO.
- Maximun Concurrency, que es el número máximo de funciones lambdas que se pueden invocar desde el SQS event source.
El algoritmo funciona de la siguiente manera:- El event source mapping utiliza el polling largo para leer los mensajes de la cola hasta que se active.
- Cuando hay mensajes disponibles, el event source mapping empieza a procesar cinco lotes a la vez con cinco invocaciones concurrentes de la función Lambda.
- Si hay más mensajes disponibles, el event source mapping aumenta el número de procesos que leen lotes en hasta 300 más por minuto, hasta llegar al máximo de concurrencia del event source mapping.
- Si se configura una ventana de lote mayor que 0, el event source mapping espera hasta que se llene el lote, se alcance el tamaño del payload o se agote la ventana de lote antes de invocar la función Lambda.
- Si se usa una cola FIFO, el event source mapping respeta el orden y la unicidad de los mensajes, y procesa un solo lote por grupo de mensajes a la vez.
Backoff del event source mapping-
El event source mapping de Lambda
implementa una estrategia de backoff para manejar los errores y los reintentos
cuando la función Lambda falla al procesar un lote de mensajes. El backoff
consiste en reducir la concurrencia del event source mapping para dar tiempo a
la función Lambda a recuperarse y evitar el desperdicio de recursos.
El backoff se aplica de forma
diferente según la causa del error:
- Si el error se debe al código de
la función Lambda, el event source mapping reduce la concurrencia del event
source mapping de forma gradual, y si las invocaciones siguen fallando, el
event source mapping deja de procesar los mensajes sin reintentar.
- Si el error se debe al throttling
de la función Lambda, el event source mapping reduce la concurrencia del event
source mapping de forma gradual, y sigue reintentando los mensajes hasta que el
timestamp del mensaje supere el timeout de visibilidad de la cola, momento en
el que el event source mapping descarta el mensaje.
Cuando el event source mapping
descarta un mensaje, lo puede enviar a una cola de mensajes fallidos
(dead-letter queue) si se ha configurado previamente en la cola de origen. Esto
permite almacenar los mensajes que no se han podido procesar para analizarlos o
reenviarlos posteriormente.
Recomendaciones para la
configuración del Lambda y el SQS
Para aprovechar al máximo las
ventajas de usar Lambda con Amazon SQS, se recomienda tener en cuenta las
siguientes buenas prácticas:
- Configurar el timeout de la
función Lambda para que sea suficiente para procesar un lote completo de
mensajes. Si los mensajes tardan mucho en procesarse, elegir un tamaño de lote
menor. Un tamaño de lote grande puede mejorar la eficiencia para cargas de
trabajo que son muy rápidas o que tienen mucho overhead.
- Configurar el timeout de
visibilidad de la cola de Amazon SQS para que sea al menos seis veces el
timeout de la función Lambda, más el valor de la ventana de lote. Esto permite
que la función Lambda tenga tiempo de procesar cada lote de mensajes y de reintentar
en caso de un error de throttling.
- Configurar una cola de mensajes
fallidos en la cola de origen de Amazon SQS para almacenar los mensajes que no
se han podido procesar por la función Lambda. Asegurarse de configurar la cola
de mensajes fallidos en la cola de origen, no en la función Lambda. La cola de
mensajes fallidos que se configura en la función Lambda se usa para la cola de
invocaciones asíncronas de la función, no para las colas de origen de eventos.
- Configurar el número máximo de
recepciones en la política de redirección de la cola de origen de Amazon SQS
para que sea al menos 5. Esto permite que los mensajes tengan más oportunidades
de ser procesados antes de enviarlos a la cola de mensajes fallidos.
- Configurar la concurrencia máxima
del event source mapping de Lambda para limitar el número de invocaciones
concurrentes de la función Lambda que el event source mapping puede realizar.
Esto permite evitar que una cola consuma toda la concurrencia reservada de la
función o del resto de la cuota de concurrencia de la cuenta. No hay ningún
cargo por configurar la concurrencia máxima en un event source mapping de
Amazon SQS.
- Configurar la respuesta de lote
parcial del event source mapping de Lambda para evitar reprocesar los mensajes
que se han procesado correctamente en un lote fallido. Esto permite que la
función Lambda devuelva un éxito parcial, lo que puede ayudar a reducir el
número de reintentos innecesarios en los mensajes. Si se usa esta
característica con una cola FIFO, la función Lambda debe dejar de procesar
mensajes después del primer fallo y devolver todos los mensajes fallidos y no
procesados en la respuesta de lote parcial. Esto ayuda a preservar el orden de
los mensajes en la cola.
El backoff se aplica de forma diferente según la causa del error:
- Si el error se debe al código de
la función Lambda, el event source mapping reduce la concurrencia del event
source mapping de forma gradual, y si las invocaciones siguen fallando, el
event source mapping deja de procesar los mensajes sin reintentar.
- Si el error se debe al throttling
de la función Lambda, el event source mapping reduce la concurrencia del event
source mapping de forma gradual, y sigue reintentando los mensajes hasta que el
timestamp del mensaje supere el timeout de visibilidad de la cola, momento en
el que el event source mapping descarta el mensaje.
Cuando el event source mapping
descarta un mensaje, lo puede enviar a una cola de mensajes fallidos
(dead-letter queue) si se ha configurado previamente en la cola de origen. Esto
permite almacenar los mensajes que no se han podido procesar para analizarlos o
reenviarlos posteriormente.Using Lambda with Amazon SQS - AWS Lambda.
https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html.
Tutorial: Using Lambda with Amazon SQS - AWS
Lambda. https://docs.aws.amazon.com/lambda/latest/dg/with-sqs-example.html.
Using Amazon SQS with AWS Lambda in the AWS
Toolkit for JetBrains. https://bing.com/search?q=Using+Lambda+with+Amazon+SQS.
Amazon SQS Queue Polling From AWS Lambda with
Event Source ... - Medium.
https://medium.com/aws-lambda-serverless-developer-guide-with-hands/amazon-sqs-queue-polling-from-aws-lambda-with-event-source-mapping-invocations-2bf34108cef0.
How to use Amazon Lambda with Amazon SQS? -
AWSMAG. https://awsmag.com/how-to-use-amazon-lambda-with-amazon-sqs/.
amazon sqs - Are there any use cases of using
SQS with Lambda - Stack ....
https://stackoverflow.com/questions/49474825/are-there-any-use-cases-of-using-sqs-with-lambda.