DynamoDB のグローバルセカンダリインデックス (GSI) の書き込みスロットリングとバックプレッシャーについて - Amazon DynamoDB

DynamoDB のグローバルセカンダリインデックス (GSI) の書き込みスロットリングとバックプレッシャーについて

GSI バックプレッシャースロットリングは、書き込みオペレーションとスロットリングの間に間接的な関係が生じるため、DynamoDB の最も複雑なスロットリングシナリオの 1 つです。アプリケーションは基本テーブルに書き込みますが、1 つ以上のインデックスでキャパシティの制約によりスロットリングが発生します。

GSI バックプレッシャースロットリングについて

DynamoDB テーブルに書き込むと、そのテーブルのすべてのグローバルセカンダリインデックス (GSI) は、結果整合性モデルを使用して、非同期で更新されます。GSI にこれらの更新を処理するのに十分なキャパシティがない場合、DynamoDB はデータ整合性を維持するために基本テーブルへの書き込みを調整します。これは GSI バックプレッシャーと呼ばれます。GSI の仕組みの詳細については、「DynamoDB のグローバルセカンダリインデックス」を参照してください。

アクセスされるリソースがスロットリングの原因となるリソースでもあるダイレクトテーブルスロットリングとは異なり、GSI バックプレッシャーは基本テーブルとそのインデックス間に依存関係を作成します。基本テーブルに十分なキャパシティがある場合でも、関連付けられた GSI が更新ボリュームを処理できない場合、書き込みはスロットリングされます。この関係は、パーティションレベルの制約が基本テーブルと各 GSI に個別に適用されるため、理解することが特に重要です。それぞれに独自のパーティション構造と対応するスループット制限があります。

GSI パーティショニングは GSI のパーティションキーに基づいています。これは、基本テーブルのパーティションキーとは異なることがよくあります。基本テーブルへのアクセスがパーティション全体に完全に分散されていても、GSI 更新は特定のパーティションに集中し、GSI にホットスポットを作成する可能性があります。テーブルと GSI のパーティションキー設計に関する一般的なベストプラクティスについては、「DynamoDB パーティションキーの設計」を参照してください。

例えば、基本テーブルがパーティションキーとして customerId (均等に分散) を使用し、GSI がパーティションキーとして status (「アクティブ」、「保留中」、「クローズ」などの制限された値) を使用する場合、一般的なステータス値を持つ項目を更新すると、基本テーブルアクセスのバランスが取れていても GSI ホットパーティションを作成できます。これにより、基本テーブルと GSI の両方に十分な全体的なキャパシティがあり、基本テーブルのアクセスパターンが適切に分散されているように見える場合でも、GSI ホットパーティションが原因でアプリケーションのスロットリングが発生する可能性がある、特に困難なシナリオが作成されます。

スロットリング例外は GSI を指していますが (ResourceArn 経由)、スロットリングされる実際のオペレーションは基本テーブルへの書き込みです。アプリケーションが基本テーブルに書き込んでいるが、GSI に関する例外を受信しているため、これは混乱を招く可能性があります。

GSI スロットリングのタイプ

GSI バックプレッシャースロットリングは、特定のキャパシティ制約に応じて異なる例外タイプを通じて現れます。

  • GSI プロビジョンドキャパシティの超過: GSI に基本テーブルオペレーションからの更新を処理するのに十分な書き込みキャパシティユニットがない場合に発生します。これにより、理由が IndexWriteProvisionedThroughputExceededProvisionedThroughputExceededException が生成され、ResourceArn はキャパシティ制約が発生している特定の GSI を直接指します。

  • GSI オンデマンド最大スループット超過: GSI 書き込みオペレーションがオンデマンドテーブルで設定された最大制限を超えた場合に発生します。これにより、理由が IndexWriteMaxOnDemandThroughputExceededThrottlingException が生成され、スループット制限が設定された特定の GSI が識別されます。

  • GSI パーティションの制限を超過: 全体的な GSI キャパシティが十分であると思われる場合でも、個々の GSI パーティションがスループット制限 (ホットパーティション) を超えたときに発生します。これにより、IndexWriteKeyRangeThroughputExceeded を理由とする ThrottlingException が生成され、ResourceArn で識別された特定の GSI でホットパーティションの問題が示されます。GSI パーティションディストリビューションは基本テーブルのパーティションディストリビューションと大きく異なり、基本テーブルアクセスが均等に分散されている場合でも GSI にホットスポットが発生する可能性があるため、これは特に重要です。

  • GSI アカウント制限の超過: 特定の GSI への書き込みオペレーションが、アカウントレベルで設定されたテーブルごと (またはそのテーブル内の個々の GSI) のリージョンスループット境界を超えるとトリガーされます。DynamoDB は、アカウント制限を超えて使用量をプッシュした GSI を指す IndexWriteAccountLimitExceeded を理由とする ThrottlingException を返します。このスロットリングは、制限を超える GSI ごとに個別に発生します。テーブルごと、アカウントごと、リージョンごとのサービスクォータの詳細については、「Amazon DynamoDB のクォータ」を参照してください。