Warum dauert die Verarbeitung meiner DynamoDB Streams so lange?
Ich möchte wissen, warum die Verarbeitung meiner Amazon DynamoDB Streams so lange dauert.
Lösung
Wenn du AWS Lambda verwendest, um DynamoDB Streams zu konsumieren, hast du möglicherweise Datensätze, die in eine Tabelle geschrieben, aber nicht von Lambda verarbeitet werden. Die Verarbeitung dieser Datensätze kann sogar mehrere Stunden dauern. Um die Ursache zu beheben, überprüfe die Lambda-IteratorAge-Metrik.
Wenn das IteratorAge ansteigt, bedeutet das, dass Lambda Datensätze, die in den DynamoDB Stream geschrieben werden, nicht effizient verarbeitet. Die IteratorAge-Metrik kann aus den folgenden Gründen ansteigen.
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, versucht die Lambda-Funktion weiterhin, die Datensätze zu verarbeiten. Die Funktion versucht weiterhin, die Datensätze zu verarbeiten, bis die Datensätze ablaufen oder die Datensätze das in der Zuordnung von Ereignisquellen konfigurierte Höchstalter überschreiten. Da die in den Streams vorhandenen Datensätze nicht verarbeitet werden, kann es zu einer Spitze in der IteratorAge-Metrik kommen. Du kannst die Lambda-Fehlermetrik auf Spitzen in der Fehlermetrik überprüfen. Oder überprüfe die Lambda-Protokolle für weitere Informationen.
Um zu verhindern, dass die Aufruffehler zu einem Anstieg der IteratorAge-Metrik führen, sende die Datensätze an eine Warteschlange für unzustellbare Nachrichten (DLQ). Wenn du die Zuordnung von Ereignisquellen erstellst, gib die folgenden Informationen für die spezifischen Parameter ein:
- Wiederholungsversuche: Dieser Parameter gibt an, wie oft die Lambda-Funktion ausgeführt wird, wenn die Funktion einen Fehler aufweist. Aktualisiere diesen Wert basierend auf dem Anwendungsfall und sende die Datensätze an den DLQ, nachdem die Funktion eine bestimmte Anzahl von Wiederholungen versucht hat.
- Batch bei Fehler aufteilen: Dieser Parameter teilt einen Batch in zwei Batches auf, bevor die Funktion den Batch erneut versucht. Verwende diesen Parameter, um den Batch aufzuteilen und den Aufruf mit den kleineren Batches fortzusetzen. Das Aufteilen des Batches kann helfen, die fehlerhaften Datensätze zu isolieren, die den Aufruffehler verursachen.
Drosselungsfehler
Wenn du DynamoDB Streams verwendest, empfiehlt es sich, nicht mehr als zwei Verbraucher pro Shard zu verwenden, um eine Drosselung zu vermeiden. Da Lambda Datensätze sequentiell verarbeitet, kann Lambda Datensätze nicht weiter verarbeiten, wenn ein aktueller Aufruf gedrosselt wird. Wenn du mehr als zwei Verbraucher verwenden musst, verwende Amazon Kinesis oder ein Fanout-Muster. Oder verwende ein Parallelitätslimit in Lambda, um eine Drosselung zu verhindern.
Lambda-Durchsatz
Der Lambda-Durchsatz ist die Zeit, die ein einzelner Aufruf einer Lambda-Funktion benötigt, um einen Datensatz oder einen Batch von Datensätzen zu verarbeiten. Die folgenden Faktoren können den Durchsatz einer Lambda-Funktion beeinflussen:
Laufzeitdauer
Wenn der Wert der Dauer-Metrik hoch ist, ist der Durchsatz der Funktion niedrig, was zu einem Anstieg der IteratorAge-Metrik für die Funktion führt. Um die Laufzeit der Funktion zu verringern, erhöhe den einer Funktion zugewiesenen Speicher.
Du kannst auch den Funktionscode optimieren, um die Verarbeitung von Datensätzen zu beschleunigen.
Gleichzeitige Lambda-Ausführungen
Parallelität ist die Anzahl der Anforderungen während der Laufzeit, die die Lambda-Funktion gleichzeitig verarbeitet. Ein Anstieg der Anzahl gleichzeitiger Lambda-Aufrufe kann die Verarbeitung der Stream-Datensätze verbessern. Für jede gleichzeitige Anforderung stellt Lambda eine separate Instance der Ausführungsumgebung bereit. Die maximale Anzahl gleichzeitiger Lambda-Ausführungen wird wie folgt berechnet:
Gleichzeitige Ausführungen = Anzahl von Shards x gleichzeitige Batches pro Shard (Parallelisierungsfaktor)
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 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, 1.000 Schreibanforderungseinheiten oder die lineare Kombination aus beiden bereitstellen. Wenn du also die Parallelität erhöhen willst, erhöhe die bereitgestellte Kapazität der Tabelle, um die Anzahl der Shards zu erhöhen. du kannst die Anzahl der gleichzeitigen Batches pro Shard in der Zuordnung von 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, kannst du bis zu 50 gleichzeitige Ausführungen durchführen.
Um Änderungen auf Elementebene jederzeit in der richtigen Reihenfolge zu verarbeiten, werden Elemente mit demselben Partitionsschlüssel in denselben Batch verschoben. Der Tabellenpartitionsschlüssel muss eine hohe Kardinalität haben und der Datenverkehr darf keine Hotkeys generieren. Wenn du beispielsweise den Wert Gleichzeitige Batches pro Shard auf 10 setzt und der Schreibverkehr auf einen einzelnen Partitionsschlüssel abzielt, kannst du nur eine gleichzeitige Ausführung pro Shard durchführen.
Batch-Größe und Batch-Fenster
Das Lambda-Batchverhalten kann den Durchsatz der Funktion verringern, wenn es nicht richtig eingestellt ist. Um die Verarbeitung der DynamoDB Streams zu optimieren, passe das Batching-Fenster und die Batch-Größe an den Anwendungsfall an.
Wenn die Batch-Größe auf einen zu niedrigen Wert gesetzt ist, wird die Funktion häufig mit einer kleinen Anzahl von Datensätzen aufgerufen. Diese häufigen Aufrufe verlangsamen die Verarbeitung des Streams. Wenn der Wert für die Batch-Größe zu hoch eingestellt ist, kann sich die Funktionsdauer verlängern.
Wenn der Wert des Batch-Fensters und die Anzahl der Datensätze in diesem Fenster nicht optimiert sind, kommt es möglicherweise zu unnötigen Aufrufen desselben Shards. Diese unnötigen Aufrufe können die Verarbeitung des Streams verlangsamen. Wenn der Wert für das Batch-Fenster zu hoch ist, warte möglicherweise länger, bis die Funktion Streams verarbeitet. Diese längere Verarbeitungszeit erhöht das IteratorAge.
Um den Durchsatz zu erhöhen und den IteratorAge-Wert zu verringern, empfiehlt es sich, mehrere Kombinationen aus Batching-Fenster und Batch-Größe zu testen.
Ähnliche Informationen
Grundlegendes zu Lambda-Skalierung und Durchsatz
Grundlegendes zur Lambda-Funktionsskalierung
Verwenden des DynamoDB Streams Amazon Kinesis-Adapters zur Verarbeitung von Stream-Datensätzen
- Themen
- Database
- Tags
- Amazon DynamoDB
- Sprache
- Deutsch

Relevanter Inhalt
AWS OFFICIALAktualisiert vor 3 Jahren
AWS OFFICIALAktualisiert vor einem Jahr
AWS OFFICIALAktualisiert vor 3 Jahren
AWS OFFICIALAktualisiert vor einem Jahr