Warum steigt die Lambda-IteratorAge-Metrik für meine Amazon DynamoDB-Streams?

Lesedauer: 5 Minute
0

Beim Verwenden von Datensätzen aus meinem Amazon DynamoDB-Stream sehe ich einen Anstieg der AWS-Lambda-IteratorAge-Metrik. Warum steigt das Iteratoralter meiner Funktion und wie kann ich das lösen?

Kurzbeschreibung

Die Lambda-IteratorAge-Metrik misst die Latenz zwischen dem Hinzufügen eines Datensatzes zu einem DynamoDB-Stream und dem Zeitpunkt, zu dem die Funktion diesen Datensatz verarbeitet. Wenn IteratorAge erhöht wird, bedeutet dies, dass Lambda Datensätze, die in den DynamoDB-Stream geschrieben werden, nicht effizient verarbeitet.

Dies sind die Hauptgründe, warum IteratorAge zunimmt:

  • Fehler beim Aufrufen
  • Auftreten drosseln
  • Niedriger Lambda-Durchsatz

Auflösung

Fehler beim Aufrufen

Lambda wurde entwickelt, um Batches von Datensätzen nacheinander zu verarbeiten und Fehler erneut zu versuchen. Wenn also eine Funktion jedes Mal einen Fehler zurückgibt, wenn sie aufgerufen wird, versucht Lambda es immer wieder. Dies geschieht so lange, bis die Datensätze ablaufen oder das maximale Alter überschreiten, das Sie in der Ereignisquellenzuordnung konfigurieren. Die Aufbewahrungsfrist für DynamoDB-Streams beträgt 24. Lambda versucht es bis zu einem Tag erneut, bis der Datensatz abläuft, und fährt dann mit dem nächsten Batch von Datensätzen fort.

Überprüfen Sie die Lambda-Fehlermetrik, um zu bestätigen, ob ein Aufruffehler die Hauptursache für den IteratorAge-Spike ist. Wenn ja, überprüfen Sie die Lambda-Protokolle, um den Fehler zu debuggen, und ändern Sie dann Ihren Code. Stellen Sie sicher, dass Sie eine try-catch-Anweisung in Ihren Code aufnehmen, wenn Sie den Fehler behandeln.

In der Konfiguration der Ereignisquellenzuordnung gibt es drei Parameter, mit denen Sie IteratorAge-Spitzen verhindern können:

  • Wiederholungsversuche: Die maximale Anzahl von Versuchen, die Lambda wiederholt, wenn die Funktion einen Fehler zurückgibt.
  • Maximales Alter des Datensatzes – Das maximale Alter eines Datensatzes, den Lambda an Ihre Funktion sendet. Auf diese Weise können Sie zu alte Datensätze verwerfen.
  • Batch bei Fehler teilen – Wenn die Funktion einen Fehler zurückgibt, teilen Sie den Batch in zwei Teile auf, bevor Sie es erneut versuchen. Ein erneuter Versuch mit kleineren Batches isoliert fehlerhafte Datensätze und behebt Timeout-Probleme. Hinweis: Das Teilen eines Batch wird nicht auf das Wiederholungskontingent angerechnet.

Um verworfene Ereignisse beizubehalten, konfigurieren Sie die Ereignisquellenzuordnung, um Details zu fehlgeschlagenen Batches an eine Amazon-Simple-Queue-Service-Warteschlange (Amazon SQS) zu senden. Oder konfigurieren Sie die gleichmäßige Quellzuordnung, um Details an ein Amazon-Simple-Notification-Service-Thema (Amazon SNS) zu senden. Verwenden Sie dazu den Zielparameter bei Ausfall.

Ereignisse drosseln

Da Ereignisdatensätze sequentiell gelesen werden, können Lambda-Funktionen nicht zum nächsten Datensatz übergehen, wenn der aktuelle Aufruf gedrosselt wird.

Wenn Sie DynamoDB-Streams verwenden, konfigurieren Sie nicht mehr als zwei Verbraucher auf demselben Stream-Shard. Wenn Sie mehr als zwei Reader pro Shard haben, kann dies zu einer Drosselung führen. Wenn Sie mehr als zwei Reader für einen einzigen Stream-Shard benötigen, verwenden Sie ein Fan-Out-Pattern. Konfigurieren Sie die Lambda-Funktion so, dass Datensätze aus dem Stream verwendet werden, und leiten Sie sie dann an andere Downstream-Lambda-Funktionen oder Amazon-Kinesis-Streams weiter.

Verwenden Sie auf der Lambda-Seite ein Parallelitätslimit, um eine Drosselung zu verhindern.

Lambda-Durchsatz

Dauer der Laufzeit

Wenn die Duration-Metrik einer Lambda-Funktion hoch ist, verringert dies den Durchsatz der Funktion und erhöht die IteratorAge.

Verwenden Sie eine oder beide der folgenden Methoden, um die Laufzeit Ihrer Funktion zu verringern:

1.    Erhöhen Sie die Menge an Speicher, die der Funktion zugewiesen ist.

2.    Optimieren Sie Ihren Funktionscode, sodass weniger Zeit für die Verarbeitung von Datensätzen benötigt wird.

Gleichzeitige Lambda-Läufe

Die maximale Anzahl gleichzeitiger Lambda-Läufe wird wie folgt berechnet:

Gleichzeitige Runs = Anzahl der Shards x gleichzeitige Batches pro Shard (Parallelisierungsfaktor)

  • Anzahl der Shards – In einem DynamoDB-Stream gibt es eine 1<>1-Zuordnung zwischen der Anzahl der Partitionen der Tabelle und der Anzahl der Stream-Shards. Die Anzahl der Partitionen wird durch die Größe der Tabelle und ihren Durchsatz bestimmt. Jede Partition in der Tabelle kann bis zu 3.000 Leseanforderungseinheiten oder 1.000 Schreibanforderungseinheiten oder die lineare Kombination aus beiden bereitstellen. Um die Parallelität zu erhöhen, erhöhen Sie die Anzahl der Shards, indem Sie die bereitgestellte Kapazität der Tabelle erhöhen.
  • Gleichzeitige Batches pro Shard (Parallelisierungsfaktor) – Sie können die Anzahl der gleichzeitigen Batches pro Shard in der Ereignisquellenzuordnung konfigurieren. Die Standardeinstellung ist 1 und kann auf bis zu 10 erhöht werden.

Wenn die Tabelle beispielsweise 10 Partitionen hat und die Anzahl der gleichzeitigen Batches pro Shard auf 5 festgelegt ist, können bis zu 50 gleichzeitige Durchläufe ausgeführt werden.

Hinweis: Um Änderungen auf Artikelebene zu einem bestimmten Zeitpunkt in der richtigen Reihenfolge zu verarbeiten, gehen Elemente mit demselben Partitionsschlüssel in denselben Batch. Stellen Sie daher sicher, dass Ihr Tabellenpartitionsschlüssel eine hohe Kardinalität aufweist und dass Ihr Datenverkehr keine Hotkeys generiert. Wenn Sie beispielsweise den Wert für gleichzeitige Batches pro Shard auf 10 festlegen und Ihr Schreibdatenverkehr auf einen einzelnen Partitionsschlüssel abzielt, können Sie pro Shard nur einen gleichzeitigen Lauf durchführen.

Batch-Größe

Durch die Abstimmung der Batch-Größe können Sie den Lambda-Durchsatz erhöhen. Wenn Sie eine geringe Anzahl von Datensätzen pro Batch verarbeiten, verlangsamt dies die Verarbeitung des Streams.

Wenn Sie dagegen eine hohe Anzahl von Datensätzen pro Batch haben, kann dies die Dauer der Funktionsausführung verlängern. Testen Sie also mit mehreren Werten, um den besten Wert für Ihren Anwendungsfall zu finden.

Wenn die Laufzeit Ihrer Funktion unabhängig von der Anzahl der Datensätze in einem Ereignis ist, verringert eine Erhöhung der Batch-Größe Ihrer Funktion das Iteratoralter der Funktion.


Relevante Informationen

Nutzung von AWS Lambda mit Amazon DynamoDB

Wie speichere ich Amazon-SNS-Benachrichtigungen für Amazon-SES-E-Mails in DynamoDB mit Lambda?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren