Pourquoi la métrique Lambda IteratorAge augmente-t-elle pour mes Amazon DynamoDB Streams ?

Dernière mise à jour : 12/09/2022

Lorsque je consomme des enregistrements de mon flux Amazon DynamoDB, je constate un pic dans la métrique AWS Lambda IteratorAge. Pourquoi l'âge de l'itérateur de ma fonction augmente-t-il et comment puis-je résoudre ce problème ?

Brève description

La métrique Lambda IteratorAge mesure la latence entre le moment où un enregistrement est ajouté à un flux DynamoDB et le moment où la fonction traite cet enregistrement. Lorsque IteratorAge augmente, cela signifie que Lambda ne traite pas efficacement les enregistrements écrits dans le flux DynamoDB.

Voici les principales raisons pour lesquelles la métrique IteratorAge augmente :

  • Erreurs d'invocation
  • Occurrence de l'accélérateur
  • Faible débit Lambda

Solution

Erreurs d'invocation

Lambda est conçu pour traiter des lots d'enregistrements en séquence et réessayer en cas d'erreur. Ainsi, si une fonction renvoie une erreur chaque fois qu'elle est invoquée, Lambda continue d'effectuer des tentatives. Il réessaye jusqu'à ce que les enregistrements expirent ou dépassent l'âge maximum que vous avez configuré sur le mappage de source d'événement. La période de conservation des flux DynamoDB est de 24. Lambda continue de réessayer pendant un jour, jusqu'à ce que l'enregistrement expire, puis passe au lot d'enregistrements suivant.

Vérifiez la métrique d'erreurs Lambda pour confirmer si une erreur d'invocation est à l'origine du pic de la métrique IteratorAge. Si c'est le cas, consultez les journaux Lambda pour déboguer l'erreur, puis modifiez votre code. Assurez-vous d'inclure une instruction try-catch dans votre code lorsque vous traitez l'erreur.

La configuration du mappage des sources d'événements comporte trois paramètres qui peuvent vous aider à éviter les pics de la métrique IteratorAge :

  • Nouvelles tentatives : nombre maximal de nouvelles tentatives de Lambda lorsque la fonction renvoie une erreur.
  • Âge maximum de l'enregistrement : l'âge maximum d'un enregistrement que Lambda envoie à votre fonction. Cela vous permet d'ignorer les enregistrements trop anciens.
  • Diviser le lot en cas d'erreur : lorsque la fonction renvoie une erreur, le lot est divisé en deux avant un nouvel essai. Une nouvelle tentative avec des lots plus petits isole les mauvais enregistrements et évite les problèmes de délai d'expiration. Remarque : la division d'un lot n'est pas prise en compte dans le quota de nouvelles tentatives.

Pour retenir les événements ignorés, configurez le mappage de source d'événement pour envoyer les détails sur les lots en échec à une file d'attente Amazon Simple Queue Service (Amazon SQS). Ou bien, vous pouvez également configurer le mappage de source d'événement pour envoyer les détails à une rubrique Amazon Simple Notification Service (Amazon SNS). Pour ce faire, utilisez le paramètre On-failure destination (Destination en cas d'échec).

Événements d'accélérateur

Comme les enregistrements d'événements sont lus de manière séquentielle, les fonctions Lambda ne peuvent pas passer à l'enregistrement suivant si l'appel en cours est limité.

Lorsque vous utilisez des flux DynamoDB, ne configurez pas plus de deux consommateurs sur la même partition de flux. Si vous avez plus de deux lecteurs par partition, cela peut entraîner une limitation. Si vous avez besoin de plus de deux lecteurs sur une même partition de flux, utilisez un modèle de distribution. Configurez la fonction Lambda pour utiliser les enregistrements du flux, puis transférez-les vers d'autres fonctions Lambda en aval ou des flux Amazon Kinesis.

Du côté Lambda, utilisez une limite de simultanéité pour empêcher la limitation.

Débit Lambda

Durée d'exécution

Si la métrique Duration (Durée) d'une fonction Lambda est élevée, cela réduit le débit de la fonction et augmente la métrique IteratorAge.

Pour réduire la durée d'exécution de votre fonction, utilisez l'une des méthodes suivantes ou les deux :

1.    Augmentez la quantité de mémoire allouée à la fonction.

2.    Optimisez votre code de fonction afin de réduire le temps nécessaire au traitement des enregistrements.

Exécutions Lambda simultanées

Le nombre maximal d'essais Lambda simultanés est calculé comme suit :

Exécutions simultanées = nombre de partitions x lots simultanés par partition (facteur de parallélisation)

  • Nombre de partitions : dans un flux DynamoDB, il existe un mappage 1<>1 entre le nombre de partitions de la table et le nombre de partitions de flux. Le nombre de partitions est déterminé par la taille de la table et son débit. Chaque partition de la table peut servir jusqu'à 3 000 unités de requête en lecture ou 1 000 unités de requête en écriture, ou la combinaison linéaire des deux. Ainsi, pour accroître la simultanéité, augmentez le nombre de partitions en rehaussant la capacité allouée de la table.
  • Lots simultanés par partition (facteur de parallélisation) : vous pouvez configurer le nombre de lots simultanés par partition dans le mappage de source d'événement. La valeur par défaut est 1 et peut être augmentée jusqu'à 10.

Par exemple, si la table comporte 10 partitions et que le nombre de lots simultanés par partition est défini sur 5, vous pouvez avoir jusqu'à 50 exécutions simultanées.

Remarque : pour traiter la modification au niveau de l'élément dans le bon ordre à tout moment, les éléments dotés de la même clé de partition sont placés dans le même lot. Assurez-vous donc que la clé de partition de votre table a une cardinalité élevée et que votre trafic ne génère pas de clés sensibles. Par exemple, si vous définissez la valeur de lots simultanés par partition sur 10 et que votre trafic d'écriture cible une seule clé de partition, vous ne pouvez avoir qu'une seule exécution simultanée par partition.

Taille du lot

Le réglage de la valeur de la taille du lot vous aide à augmenter le débit de Lambda. Si vous traitez un faible nombre d'enregistrements par lot, cela ralentit le traitement du flux.

En revanche, si vous avez un nombre élevé d'enregistrements par lot, cela peut augmenter la durée d'exécution de la fonction. Testez donc plusieurs valeurs pour trouver la plus adaptée à votre cas d'utilisation.

Si la durée d'exécution de votre fonction est indépendante du nombre d'enregistrements d'un événement, l'augmentation de la taille du lot de votre fonction diminue l'âge de l'itérateur de la fonction.