質問

質問

DynamoDB Streams + AWS Lambdaを使用してチャットメッセージを処理したいと考えています。同じ会話に関するメッセージユーザーIDX:ユーザーIDY(部屋は) 順番に処理されなければなりません。全体的な順序は重要ではありません。

DynamoDBに正しい順序(room:msg1、room:msg2など)でデータをフィードすると仮定すると、ストリームがAWS Lambdaに順番にフィードすることを保証するにはどうすればよいでしょうか。単一のストリーム全体にわたる関連メッセージ(ルーム)の処理の順序を保証する?

たとえば、2 つのシャードがある場合、論理グループが同じシャードに移動するようにするにはどうすればよいでしょうか?

私はこれを達成しなければなりません:

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

これは違います (メッセージはデータベースに保存した順序を尊重していますが、異なるシャードに配置されているため、同じ部屋の異なるシーケンスが誤って並行して処理されています)。

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

この公式役職これについては言及されていますが、ドキュメントのどこにも実装方法が見つかりませんでした。

単一の主キーに加えられた一連の変更の相対的な順序は、シャード内で保持されます。さらに、特定のキーは、特定の時点でアクティブな兄弟シャードのセットのうち最大で 1 つに存在します。その結果、コードでは、シャード内のストリーム レコードを処理するだけで、アイテムへの変更を正確に追跡できます。

質問

1) DynamoDB ストリームでパーティションキーを設定する方法は?

2) パーティション キーの一貫した配信を保証する Stream シャードを作成するにはどうすればよいですか?

3) 結局、これは本当に可能なのでしょうか? 公式記事には次のように書かれています:特定のキーは、特定の時点でアクティブな兄弟シャードのセットのうち最大で 1 つに存在します。つまり、上記の例のように、msg1 はシャード 1 に送られ、次に msg2 はシャード 2 に送られるということですか?

4) でこれ質問ですが、これを見つけました:

ストリームのシャードの数は、テーブルのパーティションの数に基づきます。したがって、4 つのパーティションを持つ DDB テーブルがある場合、ストリームには 4 つのシャードがあります。各シャードは特定のパーティションに対応しているため、同じパーティション キーを持つすべてのアイテムが同じパーティションに存在する必要があることを考えると、それらのアイテムは同じシャードに存在することも意味します。

これは、必要なことを自動的に達成できることを意味しますか?「同じパーティションを持つすべてのアイテムは同じシャードに存在します」Lambdaはこれを尊重しますか?

5) からよくある質問:

異なるシャード間でのレコードの順序は保証されず、各シャードの処理は並行して行われます。

私はグローバルな順序付けには関心がなく、例のように論理的な順序付けだけを気にしています。それでも、FAQ のこの回答では、シャードが論理的にグループ化されるかどうかは不明です。

答え1

この回答は役に立ちますか?

https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards

異なるシャード間でのレコードの順序は保証されず、各シャードの処理は並行して行われます。

関連情報