Ir al contenido principal

¿Cómo usar Lambda con Amazon SQS para procesar mensajes de forma asíncrona y escalable?


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.

 

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.

 


Entradas populares de este blog

¿Qué es el patrón Circuit Breaker y cómo se puede implementar con AWS Step Functions?

En el desarrollo de software, es común que las aplicaciones se comuniquen con servicios o recursos externos, como bases de datos, APIs o microservicios. Sin embargo, estos servicios o recursos pueden fallar o estar temporalmente indisponibles por diversas razones, lo que puede afectar el rendimiento y la disponibilidad de la aplicación. Para manejar estos escenarios de falla, se puede utilizar el patrón Circuit Breaker, que consiste en detectar y prevenir que una operación que tiene alta probabilidad de fallar se ejecute repetidamente, causando más problemas o consumiendo recursos innecesarios.  El patrón Circuit Breaker tiene tres estados posibles: cerrado, abierto y medio abierto. Cerrado : En este estado, el circuito está funcionando normalmente y la operación se ejecuta sin problemas. Si se detecta una falla, se incrementa un contador de fallas y se calcula un umbral de fallas, que puede ser un número o un porcentaje de fallas permitidas. Si el contador de fallas supera el umbra

SNS vs EventBridge

La diferencia principal entre ambos servicios radica principalmente en el patrón de arquitectura que intentan cubrir: Message Broker o Event Bus. Message Broker Un message broker es un intermediario que se encarga de traducir y transportar los mensajes entre los servicios que los producen y los que los consumen. El message broker tiene una expectativa sobre cómo el consumidor maneja el mensaje y existe un contrato entre las dos partes. Un ejemplo de aplicación de un message broker es una cola de trabajo, donde los servicios envían tareas a realizar y otros servicios las reciben y las procesan. SNS es un ejemplo de message broker, ya que permite enviar mensajes a diferentes tipos de suscriptores y esperar una confirmación de entrega. Event Bus Un event bus es un canal que se encarga de distribuir los eventos entre los servicios que los generan y los que los escuchan. El event bus no tiene ninguna expectativa sobre cómo el oyente maneja el evento y no existe un contrato entre las dos par