¿Por qué aumenta la métrica IteratorAge de Lambda en mis flujos de Amazon DynamoDB Streams?

6 minutos de lectura
0

Al consumir registros de mi flujo de Amazon DynamoDB, veo un pico en la métrica IteratorAge de AWS Lambda. ¿Por qué aumenta la antigüedad del iterador de mi función y cómo puedo resolverlo?

Breve descripción

La métrica IteratorAge de Lambda mide la latencia entre el momento en que se agrega un registro a un flujo de DynamoDB y el momento en que la función procesa ese registro. Cuando IteratorAge aumenta, significa que Lambda no está procesando con eficacia los registros que se escriben en el flujo de DynamoDB.

Estas son las principales razones por las que IteratorAge aumenta:

  • Errores de invocación
  • Incidencia de limitaciones
  • Bajo rendimiento de Lambda

Resolución

Errores de invocación

Lambda tiene la función de procesar lotes de registros en secuencia y reintentar en caso de error. Por lo tanto, si una función devuelve un error cada vez que se invoca, Lambda sigue intentando. Lo hace hasta que los registros caduquen o superen la antigüedad máxima que se haya configurado en la asignación de la fuente de eventos. El periodo de retención de flujos de DynamoDB es de 24. Lambda sigue intentando por un día como máximo, hasta que el registro expira y, luego, pasa al siguiente lote de registros.

Compruebe la métrica de errores de Lambda para confirmar si un error de invocación es la causa principal del pico de IteratorAge. Si es así, compruebe los registros de Lambda para depurar el error y, luego, modifique el código. Procure incluir una sentencia try-catch en su código cuando aborde el error.

Hay tres parámetros en la configuración de la asignación de la fuente de eventos que pueden ayudarle a prevenir los picos de IteratorAge:

  • Reintentos: el número máximo de veces que Lambda reintenta cuando la función devuelve un error.
  • Antigüedad máxima de registro: la antigüedad máxima de un registro que Lambda envía a la función. Esto le ayuda a descartar los registros que son demasiado antiguos.
  • División del lote en caso de error: cuando la función devuelve un error, divide el lote en dos antes de volver a intentarlo. Reintentar con lotes más pequeños aísla los registros malos y evita los problemas de tiempo de espera. Nota: La división de un lote no cuenta para la cuota de reintentos.

A fin de retener los eventos descartados, configure la asignación del origen de los eventos para enviar los detalles de los lotes fallidos a una cola de Amazon Simple Queue Service (Amazon SQS). O bien, configure la asignación de origen uniforme para enviar los datos a un tema de Amazon Simple Notification Service (Amazon SNS). Para hacerlo, utilice el parámetro On-failure destination.

Incidencias de limitaciones

Dado que los registros de eventos se leen de forma secuencial, las funciones de Lambda no pueden avanzar hasta el siguiente registro si se limita la invocación actual.

Cuando utilice flujos de DynamoDB, no configure más de dos consumidores en la misma partición de flujo. Si tiene más de dos lectores por partición, esto puede provocar una limitación. Si necesita más de dos lectores en una sola partición de flujo, utilice un patrón de distribución ramificada. Configure la función de Lambda para que consuma registros del flujo y, luego, los reenvíe a otras funciones de distribución de Lambda o a flujos de Amazon Kinesis.

En el extremo de Lambda, utilice un límite de simultaneidad para evitar la limitación.

Rendimiento de Lambda

Tiempo de ejecución

Si la métrica Duration de una función de Lambda es alta, entonces esto disminuye el rendimiento de la función y aumenta el IteratorAge.

Para disminuir la duración del tiempo de ejecución de su función, utilice uno o ambos de los siguientes métodos:

1.    Aumente la cantidad de memoria asignada a la función.

2.    Optimice su código de función a fin de que se necesite menos tiempo para procesar los registros.

Ejecuciones simultáneas de Lambda

La cantidad máxima de ejecuciones simultáneas de Lambda se calcula de la siguiente manera:

Ejecuciones simultáneas = cantidad de particiones x lotes simultáneos por partición (factor de paralelización)

  • Cantidad de particiones: en una secuencia de DynamoDB, hay una asignación 1<>1 entre la cantidad de particiones de la tabla y la cantidad de particiones de la secuencia. La cantidad de particiones se determina según el tamaño de la tabla y su rendimiento. Cada partición de la tabla puede servir hasta 3000 unidades de petición de lectura o 1000 unidades de petición de escritura o la combinación lineal de ambas. Por lo tanto, para aumentar la simultaneidad, aumente la cantidad de particiones mediante un incremento de la capacidad provista de la tabla.
  • Lotes simultáneos por partición (factor de paralelización): puede configurar la cantidad de lotes simultáneos por partición en la asignación de origen de eventos. El valor predeterminado es 1 y se puede aumentar hasta 10.

Por ejemplo, si la tabla tiene 10 particiones y los lotes simultáneos por partición se establecen en 5, puede tener hasta 50 ejecuciones simultáneas.

Nota: Para procesar la modificación a nivel de artículo en el orden correcto en un momento dado, los artículos con la misma clave de partición van al mismo lote. Por lo tanto, garantice que la clave de partición de su tabla tenga una alta cardinalidad y que su tráfico no genere claves calientes. Por ejemplo, si establece el valor de lotes simultáneos por partición en 10 y el tráfico de escritura se dirige a una sola clave de partición, solo puede tener una ejecución simultánea por partición.

Tamaño del lote

Ajustar el valor del tamaño del lote le ayuda a aumentar el rendimiento de Lambda. Si se procesa un número bajo de registros por lote, se ralentiza el procesamiento del flujo.

Por otro lado, si tiene un número elevado de registros por lote, esto podría aumentar la duración de la ejecución de la función. Por lo tanto, realice pruebas con varios valores a fin de encontrar el mejor valor para su caso de uso.

Si la duración del tiempo de ejecución de su función es independiente del número de registros de un evento, el aumento del tamaño del lote de su función disminuye la antigüedad del iterador de la función.


Información relacionada

Uso de AWS Lambda con Amazon DynamoDB

¿Cómo se pueden almacenar las notificaciones de Amazon SNS para los correos electrónicos de Amazon SES en DynamoDB mediante Lambda?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 años