Uso de Lambda con Amazon SQS
nota
Si desea enviar datos a un destino que no sea una función de Lambda o enriquecer los datos antes de enviarlos, consulte Amazon EventBridge Pipes (Canalizaciones de Amazon EventBridge).
Puede utilizar una función de Lambda para procesar mensajes en una cola de Amazon Simple Queue Service (Amazon SQS). Las asignaciones de orígenes de eventos de Lambda son compatibles con las colas estándar y las colas de primero en entrar, primero en salir (FIFO). También puede usar el modo aprovisionado para asignar recursos de sondeo dedicados a las asignaciones de orígenes de eventos de Amazon SQS. La función de Lambda y la cola de Amazon SQS deben estar en la misma Región de AWS, aunque pueden estar en diferentes Cuentas de AWS.
Cuando se procesan mensajes de Amazon SQS, se debe implementar una lógica de respuesta por lotes parcial para evitar que se intente reprocesar los mensajes ya procesados correctamente cuando algunos mensajes de un lote fallan. La utilidad de procesador por lotes
Temas
Uso del modo aprovisionado con las asignaciones de orígenes de eventos de Amazon SQS
Configuración del modo aprovisionado para las asignación de orígenes de eventos de Amazon SQS
Creación y configuración de una asignación de orígenes de eventos de Amazon SQS
Configuración del comportamiento de escalado para las asignaciones de orígenes de eventos de SQS
Gestión de errores para un origen de eventos de SQS en Lambda
Parámetros de Lambda para las asignaciones de origen de eventos de Amazon SQS
Uso del filtrado de eventos con una fuente de eventos de Amazon SQS
Tutorial: Uso de una cola entre cuentas de Amazon SQS como un origen de eventos
Descripción del comportamiento de sondeo y procesamiento por lotes para las asignaciones de orígenes de eventos de Amazon SQS
Con las asignaciones de orígener de eventos de Amazon SQS, Lambda sondea la cola e invoca su función sincrónicamente con un evento. Cada evento puede contener un lote de varios mensajes de la cola. Lambda recibe estos eventos lote por lote e invoca su función una vez por lote. Cuando la función procesa correctamente un lote, Lambda elimina sus mensajes de la cola.
Cuando Lambda lee un lote, los mensajes se mantienen en la cola, pero se ocultan durante el tiempo de espera de visibilidad de la cola. Cuando la función procesa correctamente todos los mensajes en el lote, Lambda elimina sus mensajes de la cola. De forma predeterminada, si la función detecta un error al procesar un lote, todos los mensajes de ese lote se vuelven a ver en la cola después de que expire el tiempo de visibilidad. Por este motivo, el código de su función debe ser capaz de procesar el mismo mensaje varias veces sin efectos secundarios no deseados.
aviso
Las asignaciones de orígenes de eventos de Lambda procesan cada evento al menos una vez, y puede producirse un procesamiento duplicado de registros. Para evitar posibles problemas relacionados con la duplicación de eventos, le recomendamos encarecidamente que haga que el código de la función sea idempotente. Para obtener más información, consulte ¿Cómo puedo hacer que mi función de Lambda sea idempotente?
Para evitar que Lambda procese un mensaje varias veces, puede configurar la asignación de orígenes de eventos para incluir los errores de los elementos del lote en la respuesta de la función, o puede utilizar la acción DeleteMessage de la API para eliminar los mensajes de la cola a medida que la función de Lambda los procese correctamente.
Para obtener más información sobre los parámetros de configuración que Lambda admite para asignaciones de orígenes de eventos de SQS, consulte Creación de una asignación de orígenes de eventos.
Uso del modo aprovisionado con las asignaciones de orígenes de eventos de Amazon SQS
Para las cargas de trabajo en las que necesite afinar el rendimiento de su asignación de orígenes de eventos, puede utilizar el modo aprovisionado. En el modo aprovisionado, usted define los límites mínimos y máximos para la cantidad de sondeos de eventos aprovisionados. Estos sondeos de eventos aprovisionados están dedicados a la asignación de orígenes de eventos y pueden gestionar los picos de mensajes inesperados mediante un ajuste de escalado automático adaptable. La asignación de orígenes de eventos de Amazon SQS configurada con el modo aprovisionado se escala 3 veces más rápido (hasta 1000 invocaciones simultáneas por minuto) y admite una concurrencia 16 veces mayor (hasta 20 000 invocaciones simultáneas) que la capacidad de asignación de orígenes de eventos predeterminada de Amazon SQS. Le recomendamos que utilice el modo aprovisionado para las cargas de trabajo impulsadas por eventos de Amazon SQS que tengan requisitos de rendimiento estrictos, como las empresas de servicios financieros que procesan fuentes de datos de mercado, las plataformas de comercio electrónico que ofrecen recomendaciones personalizadas en tiempo real y las empresas de juegos que administran las interacciones de los jugadores en directo. El uso del modo aprovisionado conlleva costos adicionales. Para obtener más información sobre precios, consulte Precios de AWS Lambda
Cada sondeador de eventos en modo aprovisionado puede gestionar hasta 1 MB/s de rendimiento, hasta 10 invocaciones simultáneas o hasta 10 llamadas a la API de sondeo de Amazon SQS por segundo. El rango de valores aceptados para el número mínimo de sondeadores de eventos (MinimumPollers) oscila entre 2 y 200, con el valor predeterminado de 2. El rango de valores aceptados para el número máximo de sondeadores de eventos (MaximumPollers) oscila entre 2 y 2000, con el valor predeterminado de 200. MaximumPollers debe ser mayor o igual que MinimumPollers.
Determinación de los sondeadores de eventos necesarios
Para estimar el número de sondeadores de eventos necesarios para garantizar un rendimiento óptimo del procesamiento de mensajes cuando se utiliza el modo aprovisionado para la ESM de SQS, recopile las siguientes métricas para su aplicación: picos de eventos de SQS por segundo que requieren un procesamiento de baja latencia, tamaño medio de la carga útil de los eventos de SQS, duración promedio de la función de Lambda y tamaño de lote configurado.
En primer lugar, puede estimar el número de eventos de SQS por segundo (EPS) que admite un sondeador de eventos para la carga de trabajo mediante la siguiente fórmula:
EPS per event poller = minimum( ceiling(1024 / average event size in KB), ceiling(10 / average function duration in seconds) * batch size, min(100, 10 * batch size) )
A continuación, puede calcular el número mínimo de sondeadores necesarios con la siguiente fórmula. Este cálculo garantiza un aprovisionamiento de capacidad suficiente para satisfacer sus necesidades de tráfico máximo.
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
Considere una carga de trabajo con un tamaño de lote predeterminado de 10, un tamaño promedio de eventos de 3 KB, una duración promedio de la función de 100 ms y el requisito de gestionar 1000 eventos por segundo. En este escenario, cada sondeador de eventos admitirá aproximadamente 100 eventos por segundo (EPS). Por lo tanto, debe establecer un mínimo de 10 sondeadores para gestionar adecuadamente los requisitos de tráfico máximo. Si su carga de trabajo tiene las mismas características, pero una duración promedio de la función de 1 segundo, cada sondeador solo admitirá 10 EPS, por lo que deberá configurar 100 sondeadores como mínimo para que admitan 1000 eventos por segundo con una latencia baja.
Recomendamos utilizar un tamaño de lote predeterminado de 10 o más para maximizar la eficiencia de los sondeadores de eventos en modo aprovisionado. Los tamaños de lote más altos permiten que cada sondeador procese más eventos por invocación, lo que mejora el rendimiento y la rentabilidad. Cuando planifique la capacidad del sondeador de eventos, tenga en cuenta los posibles picos de tráfico y considere la posibilidad de establecer el valor de minimumPollers ligeramente por encima del mínimo calculado para proporcionar un búfer. Además, supervise las características de su carga de trabajo a lo largo del tiempo, ya que los cambios en el tamaño de los mensajes, la duración de las funciones o los patrones de tráfico pueden requerir ajustes en la configuración del sondeador de eventos para mantener un rendimiento y una rentabilidad óptimos. Para planificar la capacidad de forma precisa, le recomendamos que pruebe su carga de trabajo específica para determinar el EPS real que puede generar cada sondeador de eventos.
Configuración del modo aprovisionado para las asignación de orígenes de eventos de Amazon SQS
Puede configurar el modo aprovisionado para la asignación de orígenes de eventos de Amazon SQS mediante la consola o la API de Lambda.
Cómo configurar el modo aprovisionado para una asignación de orígenes de eventos de Amazon SQS existente (consola)
-
Abra la página de Funciones
en la consola de Lambda. -
Elija la función con la asignación de orígenes de eventos de Amazon SQS para la que desee configurar el modo aprovisionado.
-
Elija Configuración y, a continuación, seleccione Desencadenadores.
-
Elija la asignación de orígenes de eventos de Amazon SQS para la que desee configurar el modo aprovisionado y, a continuación, seleccione Editar.
-
En Configuración de la asignación de orígenes de eventos, elija Configurar el modo aprovisionado.
-
En Número mínimo de sondeos de eventos, introduzca un valor entre 2 y 200. Si no especifica un valor, Lambda asigna el valor predeterminado de 2.
-
En Número máximo de sondeos de eventos, introduzca un valor entre 2 y 2000. Este valor debe ser mayor o igual que su valor para Número mínimo de sondeos de eventos. Si no especifica un valor, Lambda asigna el valor predeterminado de 200.
-
-
Seleccione Save.
Puede configurar el modo aprovisionado mediante programación con el objeto ProvisionedPollerConfig incluido en su EventSourceMappingConfiguration. Por ejemplo, el siguiente comando de la CLI UpdateEventSourceMapping configura un valor de MinimumPollers de 5 y un valor MaximumPollers de 100.
aws lambda update-event-source-mapping \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \ --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
Tras configurar el modo aprovisionado, puede observar el uso de los sondeos de eventos para su carga de trabajo supervisando la métrica ProvisionedPollers. Para obtener más información, consulte la métrica de la asignación de orígenes de eventos.
Para deshabilitar el modo aprovisionado y volver al modo predeterminado (bajo demanda), puede usar el siguiente comando de la CLI UpdateEventSourceMapping:
aws lambda update-event-source-mapping \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \ --provisioned-poller-config '{}'
nota
El modo aprovisionado no se puede utilizar junto con el ajuste de concurrencia máxima. Cuando utiliza el modo aprovisionado, controla la máxima concurrencia mediante el número máximo de sondeadores de eventos.
Para obtener más información sobre la configuración del modo aprovisionado, consulte Creación y configuración de una asignación de orígenes de eventos de Amazon SQS.
Ejemplo de evento de mensaje en cola estándar
ejemplo Evento de mensaje de Amazon SQS (cola estándar)
{ "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": { "myAttribute": { "stringValue": "myValue", "stringListValues": [], "binaryListValues": [], "dataType": "String" } }, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" }, { "messageId": "2e1424d4-f796-459a-8184-9c92662be6da", "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082650636", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082650649" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue", "awsRegion": "us-east-2" } ] }
De forma predeterminada, Lambda sondea hasta 10 mensajes en su cola a la vez y envía ese lote a la función. Para evitar invocar la función con un número pequeño de registros, puede configurar el origen del evento de modo que almacene en búfer registros hasta 5 minutos mediante la definición de una ventana de lote. Antes de invocar la función, Lambda continúa el sondeo de los mensajes de la cola estándar hasta que caduque la ventana de lotes, se alcance la cuota de tamaño de carga de invocaciones o se alcance el tamaño de lote máximo configurado.
Si utiliza un intervalo de lote y la cola de SQS contiene muy poco tráfico, Lambda puede esperar hasta 20 segundos antes de invocar la función. Esto sucederá incluso si establece un intervalo de lote inferior a 20 segundos.
nota
En Java, es posible que se produzcan errores de puntero nulo al deserializar JSON. Esto podría deberse a la forma en que el mapeador de objetos JSON convierte las mayúsculas/minúsculas de “Records” y “EventSourceARN”.
Ejemplo de evento de mensajes de cola FIFO
Para las colas FIFO, los registros contienen atributos adicionales relacionados con la deduplicación y la secuenciación.
ejemplo Evento de mensaje de Amazon SQS (cola de FIFO)
{ "Records": [ { "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5", "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...", "body": "Test message.", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1573251510774","SequenceNumber": "18849496460467696128", "MessageGroupId": "1","SenderId": "AIDAIO23YVJENQZJOL4VO","MessageDeduplicationId": "1","ApproximateFirstReceiveTimestamp": "1573251510774" }, "messageAttributes": {}, "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo", "awsRegion": "us-east-2" } ] }