¿Por qué aumenta la métrica IteratorAge de Lambda de mi secuencia de DynamoDB?

6 minutos de lectura
0

Cuando AWS Lambda consume registros de Amazon DynamoDB Streams, observo una subida en la métrica IteratorAge de Lambda.

Descripción breve

La métrica IteratorAge de Lambda mide la latencia entre el momento en que se añade un registro a una secuencia de DynamoDB y el momento en que la función procesa ese registro. Un aumento de IteratorAge significa que Lambda no procesa de manera eficiente los registros que se escriben en la secuencia de DynamoDB.

La métrica IteratorAge puede aumentar por los siguientes motivos:

  • Errores de invocación
  • Aparición de limitaciones
  • Rendimiento bajo de Lambda

Resolución

Errores de invocación

Lambda se ha diseñado para procesar lotes de registros de forma secuencial y, a continuación, volver a intentarlo en caso de error. Si una función devuelve un error cada vez que se invoca, Lambda sigue reintentándolo hasta que caduquen los registros. Lambda también puede seguir reintentándolo hasta que supere la antigüedad máxima que configuró en la asignación de orígenes de eventos. El periodo de retención de secuencias de DynamoDB es de 24 horas. Lambda sigue reintentándolo durante un día como máximo. Una vez transcurrido este periodo, pasa al siguiente lote de registros.

Para confirmar si un error de invocación es la causa principal de la subida de IteratorAge, consulta la métrica de errores de Lambda. Si la causa es un error de invocación, compruebe los registros de Lambda para depurar el error y, a continuación, modifique el código. Cuando resuelva el error, asegúrese de incluir una instrucción try-catch en el código.

La configuración de la asignación de orígenes de eventos tiene tres parámetros que pueden ayudarle a evitar los subidas de IteratorAge:

  • Reintentos: este parámetro establece el número máximo de veces que Lambda vuelve a intentarlo cuando la función devuelve un error.
  • Antigüedad máxima del registro: este parámetro establece la antigüedad máxima de un registro que Lambda envía a su función. Utilice este parámetro como ayuda para descartar los registros que son demasiado antiguos.
  • Dividir lote en caso de error: este parámetro le ayuda a volver a intentarlo con lotes más pequeños para aislar los registros incorrectos y solucionar los problemas de tiempo de espera. Cuando la función devuelva un error, divida el lote antes de volver a intentarlo.
    Nota: La división de un lote no se tiene en cuenta en la cuota de reintentos.

Para conservar los eventos descartados, configure la asignación de orígenes de eventos para enviar detalles sobre los lotes con errores a una cola de Amazon Simple Queue Service (Amazon SQS). También puede configurar la asignación de orígenes de eventos para enviar detalles a un tema de Amazon Simple Notification Service (Amazon SNS). Para ello, utilice el parámetro Destino en caso de error.

Apariciones de limitaciones

Como los registros de eventos se leen de forma secuencial, si la invocación actual está limitada, las funciones de Lambda no pueden avanzar al siguiente registro.

Cuando utilice secuencias de DynamoDB, no configure más de dos consumidores en la misma partición de la secuencia. Si tiene más de dos lectores en una partición, es posible que su función se limite. Para obtener más información, consulte Lectura y procesamiento de un flujo.

Si necesita más de dos lectores en una única partición de la secuencia, utilice un patrón de distribución ramificada. Configure la función de Lambda para consumir registros de la secuencia y, a continuación, reenviarlos a otras funciones de Lambda o secuencias de Amazon Kinesis descendentes. En el caso de Lambda, utilice un límite de simultaneidad para evitar la limitación.

Rendimiento de Lambda

Duración de la versión ejecutable

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

Para reducir la duración de la versión ejecutable de la función, use uno de los siguientes métodos (o ambos):

Ejecuciones simultáneas de Lambda

El número máximo de ejecuciones simultáneas de Lambda se calcula de la siguiente manera:

Ejecuciones simultáneas = Número de particiones × Lotes simultáneos por partición (factor de paralelización)

  • Número de particiones: en una secuencia de DynamoDB, se produce una asignación uno a uno entre la cantidad de particiones de la tabla y la cantidad de particiones de la secuencia. El tamaño de la tabla y el rendimiento de la tabla determinan el número de particiones. Cada partición de la tabla puede atender hasta 3000 unidades de solicitud de lectura o 1000 unidades de solicitud de escritura, o la combinación lineal de ambas. Para aumentar la simultaneidad, aumente la capacidad aprovisionada de la tabla para aumentar la cantidad de particiones.
  • 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 orígenes 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 están establecidos en 5, puede tener hasta 50 ejecuciones simultáneas.

Nota: Para procesar la modificación por elemento en el orden correcto en un momento dado, los elementos con la misma clave de partición van al mismo lote. Asegúrese de que la clave de partición de la tabla tenga una cardinalidad alta y de que el tráfico no genere teclas de acceso rápido. 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

Para ayudarle a aumentar el rendimiento de Lambda, ajuste el valor del tamaño del lote. Si procesa un número reducido de registros por lote, la secuencia se procesa más lentamente. Si tiene un número elevado de registros por lote, es posible que la duración de la ejecución de la función aumente. Para dar con el mejor valor para su caso de uso, se recomienda probar el tamaño del lote con varios valores.

Si la duración de la versión ejecutable de la función es independiente del número de registros de un evento, al aumentar el tamaño del lote de la función, se reduce la antigüedad del iterador de la función.

Información relacionada

Uso de AWS Lambda con Amazon DynamoDB

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 3 meses