Fragen

Fragen

Ich möchte DynamoDB Streams + AWS Lambda verwenden, um Chat-Nachrichten zu verarbeiten. Nachrichten bezüglich derselben KonversationBenutzer-IDX:Benutzer-IDY(ein Raum) muss der Reihe nach abgearbeitet werden. Die globale Reihenfolge ist nicht wichtig.

Angenommen, ich füttere DynamoDB in der richtigen Reihenfolge (room:msg1, room:msg2, etc.), wie kann ich garantieren, dass der Stream AWS Lambda sequentiell füttert, mitgarantierte Reihenfolge der Verarbeitung verwandter Nachrichten (Raum) über einen einzigen Stream?

Beispiel: Angenommen, ich habe zwei Shards. Wie stelle ich sicher, dass die logische Gruppe zum selben Shard gehört?

Ich muss Folgendes erreichen:

Shard 1: 12:12:msg3 12:12:msg2 12:12:msg1 ==> consumer
Shard 2: 13:24:msg2 51:91:msg3 13:24:msg1 51:92:msg2 51:92:msg1 ==> consumer

Und nicht dies (die Nachrichten respektieren die Reihenfolge, die ich in der Datenbank gespeichert habe, werden aber in unterschiedlichen Shards abgelegt, wodurch fälschlicherweise unterschiedliche Sequenzen für denselben Raum parallel verarbeitet werden):

Shard 1: 13:24:msg2 51:92:msg2 12:12:msg2 51:92:msg2 12:12:msg1 ==> consumer
Shard 2: 51:91:msg3 12:12:msg3 13:24:msg1 51:92:msg1 ==> consumer

Dieser BeamtePosterwähnt dies, aber ich konnte in den Dokumenten nirgends finden, wie man es implementiert:

Die relative Reihenfolge einer Folge von Änderungen, die an einem einzelnen Primärschlüssel vorgenommen werden, bleibt innerhalb eines Shards erhalten. Darüber hinaus ist ein bestimmter Schlüssel höchstens in einem von mehreren Geschwister-Shards vorhanden, die zu einem bestimmten Zeitpunkt aktiv sind. Daher kann Ihr Code einfach die Stream-Datensätze innerhalb eines Shards verarbeiten, um Änderungen an einem Element genau zu verfolgen.

Fragen

1) Wie lege ich einen Partitionsschlüssel in DynamoDB Streams fest?

2) Wie erstelle ich Stream-Shards, die eine partitionsschlüsselkonsistente Übermittlung garantieren?

3) Ist das überhaupt möglich? Denn im offiziellen Artikel heißt es:Ein bestimmter Schlüssel ist höchstens in einem Shard vorhanden, der zu einem bestimmten Zeitpunkt aktiv ist.es scheint also, dass msg1 an Shard 1 und dann msg2 an Shard 2 geht, wie in meinem Beispiel oben?

4) InDasFrage, ich habe das hier gefunden:

Die Anzahl der Shards Ihres Streams hängt von der Anzahl der Partitionen der Tabelle ab. Wenn Sie also eine DDB-Tabelle mit 4 Partitionen haben, hat Ihr Stream 4 Shards. Jeder Shard entspricht einer bestimmten Partition. Wenn also alle Elemente mit demselben Partitionsschlüssel in derselben Partition vorhanden sein sollten, bedeutet dies auch, dass diese Elemente im selben Shard vorhanden sein werden.

Bedeutet dies, dass ich das, was ich brauche, automatisch erreichen kann?„Alle Elemente mit derselben Partition sind im selben Shard vorhanden.“. Respektiert Lambda dies?

5) Von derFAQ:

Die Reihenfolge der Datensätze in den verschiedenen Shards ist nicht garantiert und die Verarbeitung der einzelnen Shards erfolgt parallel.

Die globale Reihenfolge ist mir egal, nur die logische wie im Beispiel. Trotzdem ist nicht klar, ob die Shards mit dieser Antwort aus den FAQ logisch gruppiert sind.

Antwort1

Hilft diese Antwort?

https://stackoverflow.com/questions/44266633/wie-verteilt-dynamodb-streams-records-to-shards

Die Reihenfolge der Datensätze in den verschiedenen Shards ist nicht garantiert und die Verarbeitung der einzelnen Shards erfolgt parallel.

verwandte Informationen