Warum erhöht sich die Lambda-IteratorAge-Metrik für meinen DynamoDB-Stream?

Lesedauer: 5 Minute
0

Wenn AWS Lambda Datensätze aus Amazon DynamoDB Streams verarbeitet, sehe ich einen Anstieg der Lambda-IteratorAge-Metrik.

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. Eine Erhöhung von IteratorAge bedeutet, dass Lambda Datensätze, die in den DynamoDB-Stream geschrieben werden, nicht effizient verarbeitet.

Das IteratorAge kann aus den folgenden Gründen zunehmen:

  • Aufruffehler
  • Drosselung
  • Niedriger Lambda-Durchsatz

Lösung

Aufruffehler

Lambda ist so konzipiert, dass Batches von Datensätzen nacheinander verarbeitet werden und bei Fehlern ein erneuter Versuch stattfindet. Wenn eine Funktion bei jedem Aufruf einen Fehler zurückgibt, wiederholt Lambda den Vorgang, bis die Datensätze ablaufen. Oder Lambda wiederholt den Vorgang, bis das Höchstalter überschritten wird, das Sie in der Zuordnung von Ereignisquellen konfiguriert haben. Die Aufbewahrungsdauer von DynamoDB Streams beträgt 24 Stunden. Lambda versucht es bis zu einem Tag lang erneut. Danach geht es zum nächsten Batch von Datensätzen über.

Um zu bestätigen, ob ein Aufruffehler die Hauptursache für die IteratorAge-Spitze ist, überprüfen Sie die Lambda-Fehlermetrik. Wenn ein Aufruffehler die Ursache ist, überprüfen Sie die Lambda-Protokolle, um den Fehler zu debuggen, und ändern Sie dann Ihren Code. Wenn Sie den Fehler beheben, stellen Sie sicher, dass Sie eine Try-Catch-Anweisung in Ihren Code aufnehmen.

Die Konfiguration der Zuordnung von Ereignisquellen enthält drei Parameter, mit denen Sie IteratorAge-Spitzen verhindern können:

  • **Wiederholungsversuche:**Dieser Parameter legt fest, wie viele Wiederholungsversuche Lambda durchführt, wenn die Funktion einen Fehler zurückgibt.
  • **Höchstalter des Datensatzes:**Dieser Parameter legt das Höchstalter eines Datensatzes fest, den Lambda an Ihre Funktion sendet. Verwenden Sie diesen Parameter, um Datensätze zu verwerfen, die das Höchstalter überschritten haben.
  • **Batch bei Fehler aufteilen:**Dieser Parameter hilft Ihnen, mit kleineren Batches Wiederholungsversuche durchzuführen, fehlerhafte Datensätze zu isolieren und Timeout-Probleme zu umgehen. Wenn die Funktion einen Fehler zurückgibt, teilen Sie das Batch auf, bevor Sie es erneut versuchen.
    Hinweis: Das Teilen eines Batches wird nicht auf das Wiederholungskontingent angerechnet.

Um verworfene Ereignisse beizubehalten, konfigurieren Sie die Zuordnung von Ereignisquellen so, dass Details zu fehlgeschlagenen Batches an eine Amazon Simple Queue Service (Amazon SQS)-Warteschlange gesendet werden. Oder konfigurieren Sie die Zuordnung der Ereignisquellen so, dass Details an ein Amazon Simple Notification Service (Amazon SNS)-Thema gesendet werden. Verwenden Sie dazu den Parameter Ziel für nicht erfolgreiche Verarbeitungen.

Drosselungen

Da Ereignisdatensätze der Reihe nach gelesen werden, fahren Lambda-Funktionen nicht mit dem nächsten Datensatz fort, wenn der aktuelle Aufruf gedrosselt ist.

Wenn Sie DynamoDB-Streams verwenden, konfigurieren Sie nicht mehr als zwei Verbraucher auf demselben Stream-Shard. Wenn Sie mehr als zwei Leser auf einem Shard haben, wird Ihre Funktion möglicherweise gedrosselt. Weitere Informationen finden Sie unter Lesen und Verarbeiten eines Streams.

Wenn Sie mehr als zwei Leser für einen einzelnen Stream-Shard benötigen, verwenden Sie ein Fan-Out-Muster. Konfigurieren Sie die Lambda-Funktion so, dass sie Datensätze aus dem Stream verarbeitet und sie dann an andere Downstream-Lambda-Funktionen oder Amazon Kinesis-Streams weiterleitet. Verwenden Sie für Lambda eine Parallelitätsgrenze, um eine Drosselung zu verhindern.

Lambda-Durchsatz

Laufzeitdauer

Wenn die Dauermetrik einer Lambda-Funktion hoch ist, sinkt der Durchsatz der Funktion und der IteratorAge-Wert steigt.

Wenden Sie eine oder beide dieser Methoden an, um die Laufzeitdauer Ihrer Funktion zu verringern:

Gleichzeitige Lambda-Ausführungen

Die maximale Anzahl gleichzeitiger Lambda-Ausführungen wird wie folgt berechnet:

Gleichzeitige Ausführungen = Anzahl von Shards x gleichzeitige Batches pro Shard (Parallelisierungsfaktor)

  • **Anzahl der Shards:**In einem DynamoDB-Stream gibt es eine Eins-zu-Eins-Zuordnung zwischen der Anzahl der Partitionen der Tabelle und der Anzahl der Stream-Shards. Die Größe und der Durchsatz der Tabelle bestimmen die Anzahl der Partitionen. Jede Partition in der Tabelle kann bis zu 3000 Leseanforderungen, 1000 Schreibanforderungen oder die lineare Kombination aus beiden bereitstellen. Um die Parallelität zu erhöhen, erhöhen Sie die bereitgestellte Kapazität der Tabelle, um die Anzahl der Shards zu erhöhen.
  • **Gleichzeitige Batches pro Shard (Parallelisierungsfaktor):**Sie können die Anzahl der gleichzeitigen Batches pro Shard in der Zuordnung der Ereignisquellen 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 Sie bis zu 50 gleichzeitige Ausführungen durchführen.

**Hinweis:**Um Änderungen auf Elementebene zu einem bestimmten Zeitpunkt in der richtigen Reihenfolge zu verarbeiten, werden Elemente mit demselben Partitionsschlüssel in denselben Batch verschoben. Stellen Sie sicher, dass Ihr Tabellenpartitionsschlüssel eine hohe Kardinalität hat und dass Ihr Datenverkehr keine Hotkeys generiert. Wenn Sie beispielsweise den Wert „Gleichzeitige Batches pro Shard“ auf 10 setzen und Ihr Schreibverkehr auf einen einzelnen Partitionsschlüssel abzielt, können Sie nur eine gleichzeitige Ausführung pro Shard durchführen.

Batch-Größe

Optimieren Sie den Wert für die Batch-Größe, um den Lambda-Durchsatz zu erhöhen. Wenn Sie eine geringe Anzahl von Datensätzen pro Batch verarbeiten, wird der Stream langsamer verarbeitet. Wenn Sie eine hohe Anzahl von Datensätzen pro Batch haben, kann sich die Dauer der Funktionsausführung verlängern. Um den besten Wert für Ihren Anwendungsfall zu finden, empfiehlt es sich, Ihre Batch-Größe mit mehreren Werten zu testen.

Wenn die Laufzeitdauer Ihrer Funktion von der Anzahl der Datensätze in einem Ereignis unabhängig ist, führt eine Erhöhung der Batch-Größe Ihrer Funktion zu einer Verringerung des Iterator-Alters der Funktion.

Ähnliche Informationen

Verwendung von AWS Lambda mit Amazon DynamoDB

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 4 Monaten