2016-08-02 5 views
0

Ich habe ein Szenario, in dem ich eine DynamoDB-Tabelle mit einem Trigger (ein Stream) zu einer AWS-Lambda-Funktion habe.Kann ich sicherstellen, dass AWS DynamoDB-Trigger NICHT von einer AWS-Lambda-Funktion parallel behandelt werden?

Ich mag DynamoDB als Ereignisspeicher verwenden und die Lambda-Funktion verwenden, um eine Projektion/Gesamtansicht/Lese Sicht auf die Daten zu erhalten.

Ich muß sicherstellen, dass, wenn ich ein CreateEntity Ereignis in DynamoDB speichern und dann vielleicht gleich nach, wenn ich ein UpdateEntity speichern, dass die Lambda-Funktion, um das CreateEntity Ereignis vor dem UpdateEntity Ereignisse verarbeitet.

Mein Verständnis ist, dass die Parallelität des Auslösers Lambda von der Anzahl der Shards hängt der DynamoDB Strom besteht. Wenn also der DynamoDB-Stream, den die Lambda-Funktion verwendet, 2 Shards hat und ein Event auf Shard1 geht und das andere Event auf Shard2 geht, können sie parallel von zwei Instanzen der Lambda-Funktion verarbeitet werden.

Also, wenn das CreateEntity Ereignis auf Shard1 und UpdateEntity ist auf Shard2 dann, wenn Shard1 oder die Lambda-Funktion Beispiel aus irgendeinem Grund langsam ist dann das UpdateEntity Ereignis in Shard2 könnte zuerst verarbeitet werden. Dies bedeutet, dass es nicht zur Projektion hinzugefügt werden kann, da zuvor keine Entität erstellt wurde.

Ist mein Verständnis korrekt?

Gibt es eine Möglichkeit, um sicherzustellen, dass die Ereignisse nur durch eine Instanz der Lambda-Funktion verarbeitet werden, so dass ich die Reihenfolge der Verarbeitung der Nachrichten sicherstellen kann?

Oder muss ich etwas anderes als Lambda dafür verwenden? Zum Beispiel streamt DynamoDB nach Kinesis mit meiner eigenen Anwendung, wo ich sicherstellen kann, dass nur eine Instanz der Anwendung läuft und die Bestellung auf diese Weise sicherstellt.

Antwort

0

dies ist zum Teil richtig

wenn Sie CreateEntity X, und dann UpdateEntity X, dann in fast allen Fällen. es wird auf demselben Shard passieren (Entitäten werden auf Shards nach ihrem zusammengesetzten Schlüssel aufgeteilt).

der einzige Fall, dass es nicht funktionieren, wenn Ihr Unternehmen über Scherbe aufgeteilt wird, und dies nur dann geschehen kann, wenn Sie kleine Menge einzigartige Einheiten haben, jede viele von ihnen. und wenn Sie in diesem Fall sind dann tun Sie etwas falsch ..

so in Ihrem Fall seiner gewährleistet ist ...

+0

99% der Zeit Zeit, es funktioniert jedes Mal? Also werde ich möglicherweise 1 von 100 Ereignissen verlieren, da der Auftrag umgestellt werden könnte? Das ist nicht genau das, was ich in einem System wie diesem anstrebe. Ich möchte eine Projektion der Ereignisse erstellen. Es kann schließlich konsistent sein, aber es muss korrekt sein. Und wie wird es in meinem Fall sichergestellt? Ich kann nichts darüber finden, wie der Shard basierend auf dem Schlüssel ausgewählt wird. – doorstuck

+0

nein. Ich habe 99% der Szenarien. Da ich den einzigen Fall geschrieben habe, in dem du dich in der 1% befindest, ist es, wenn du eine kleine Menge an einzigartigen Entitäten hast, und viele von ihnen, so dass deine Entity über mehr als 1 geteilt wird. Wenn es Ihr Fall ist, so dass Sie etwas falsch machen –

+0

Um dieser Diskussion hinzuzufügen und vielleicht helfen zu klären, Dynamodb Streams werden basierend auf Partitionen sharded, so dass alle Aktionen auf Elemente in der gleichen Partition in der gleichen Shard sein werden. –

Verwandte Themen