あるオンラインゲーム企業が、プレイヤーランキングをDynamoDBで管理している。パーティションキーはgameIdで、ソートキーはscoreDescending(スコア降順連番)である。毎分数十万件のスコア更新が発生し、特定のgameIdへの書き込みが集中してスロットリングエラーが頻発している。最もコスト効率よくスロットリングを解消する方法はどれか。
- A. DynamoDBのプロビジョンドキャパシティを10倍に増やし、Auto Scalingを有効にする
- B. テーブルをDynamoDB Global Tablesに変換し、複数リージョンに書き込みを分散させる
- C. DynamoDB Accelerator(DAX)を導入してキャッシュ層を追加し、読み取り負荷を軽減する
- D. パーティションキーをgameId#シャードID(0〜9のランダムサフィックス)に変更し、書き込みを10シャードに分散させる(シャードアグリゲーションはクエリ時にアプリで実行)
解答と解説を見る
正解: D
DynamoDBのスロットリングはホットパーティション問題であり、単一のパーティションキー値に書き込みが集中することで発生する。シャーディング(パーティションキーにランダムサフィックスを付加して複数パーティションに分散)が根本的な解決策である。スコアのTOP10取得時はgameId#0〜gameId#9のすべてのシャードをクエリして結果をマージする追加コードが必要だが、スロットリング解消の効果が最も高い。Aのキャパシティ増加は読み書き両方に課金され、ホットパーティション問題(1つのパーティションが1000RCU/WCU以上消費できない制約)は解決しないため根本対策にならない。CのDAXは読み取りキャッシュであり、書き込みスロットリングには効果がない。BのGlobal Tablesはマルチリージョンのディザスタリカバリ用途であり、同一gameIdへの書き込み集中を分散させる機能ではなく、コストも大幅に増加する。