2016-06-14 19 views
0

Ich möchte eine inkrementelle DynamoDB-Sicherung auf S3 mit DynamoDB-Streams durchführen. Ich habe ein Lambda, das den Dynamodb-Stream liest und Dateien in S3 schreibt. Um bereits gelesene Shards zu markieren, habe ich ExclusiveStartShardId in der Konfigurationsdatei angemeldet.Lesen von AWS Dynamodb Stream

Was ich tue, ist:

  1. den Strom Beschreiben Sie (die protokollierte ExclusiveStartShardId verwenden)
  2. Strom der Scherben
  3. Für alle Scherben erhalten, die geschlossen sind (hat EndingSequenceNumber) ich folgendes tun:
    • Get Scherbe Iterator für die bestimmte Scherbe (shardIteratorType: 'TRIM_HORIZON')
    • Iterate durch Scherbe und holen Aufzeichnungen bis NextShardIterator null wird

Das Problem hier ist, dass ich nur geschlossene Scherben und lesen, um neue Datensätze zu bekommen I (unbestimmt-Menge-of-Zeit) warten müssen es ist geschlossen.

Es scheint, dass die letzte Scherbe OPEN Zustand ist in der Regel in (hat NO EndingSequenceNumber). Wenn ich den Check für EndingSequenceNumber aus dem obigen Pseudo-Code entferne, habe ich eine Endlosschleife, denn wenn ich den letzten Shard treffe, wird NextShardIterator immer angezeigt. Ich kann auch nicht überprüfen, ob die abgerufenen Elemente 0 sind, weil es "Lücken" im Shard geben könnte.

In diesem Tutorial numChanges wird verwendet, um die Endlosschleife http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.LowLevel.Walkthrough.html#Streams.LowLevel.Walkthrough.Step5

Was in dieser Situation der beste Ansatz ist, zu stoppen?

Ich fand auch eine ähnliche Frage: Reading data from dynamodb streams. Leider konnte ich die Antwort für meine Frage nicht finden.

+2

Haben Sie den DynamoDB-Stream als Ereignisquelle für Ihre Lambda-Funktion eingerichtet? Nach Ihrer Beschreibung klingt es fast so, als ob Sie selbst versuchen würden, den Strom zu pushen. – garnaat

+0

Die Ereignisquelle für mein Lambda ist Geplantes Ereignis: hourevent (es wird jede Stunde ausgeführt). Wenn das Lambda ausgeführt wird, versuche ich den Stream von einem "Checkpoint" zu lesen und die neuen Daten zu sichern. – bpavlov

Antwort

1

Warum verbinden Sie den DynamoDB-Stream nicht als Ereignisquelle für Ihre Lambda-Funktion? Dann kümmert sich Lambda um den Stream und ruft bei Bedarf Ihre Funktion auf. Einzelheiten finden Sie unter .

+0

Aber so wird die Lambda-Funktion bei jeder Datenänderung in DynamoDB ausgeführt. Das bedeutet, ich sollte viele Backup-Dateien erstellen, auch wenn die Batch-Größe groß ist, oder ich sollte lesen und dann auf s3 schreiben, was teuer und zeitraubend ist. – bpavlov

+1

Sie können die Chargengröße bis zu einem Maximum von 10000 steuern. Ihre Lambda-Funktion müsste also nicht unbedingt für jede Änderung aufgerufen werden. – garnaat

+0

Aber soweit ich weiß, wird Lambda bei jeder Änderung/Einfügung aufgerufen, und die Batch-Größe wird verwendet, wenn zwei oder mehr Änderungen gleichzeitig auftraten. Mit anderen Worten, wenn Sie eine Modifikation/Einfügung innerhalb von 10 Sekunden und eine Chargengröße von 100 haben, wird die Lambda-Funktion in 10 Sekunden ausgeführt (Ignorieren der Chargengröße). – bpavlov

Verwandte Themen