ある企業が、Amazon DynamoDB を使って 1 日あたり数億件のリクエストを処理するソーシャルゲームのリーダーボードを実装したい。ユーザーのスコアを高速で更新・ランキング表示する必要がある。ランキングの取得は上位 100 位を表示するユースケースが最も多い。最も適切なアーキテクチャはどれか。
- A. DynamoDB テーブルでスコアをパーティションキー、ユーザー ID をソートキーとして設定し、スキャン操作でトップ 100 を取得する。
- B. DynamoDB テーブルのグローバルセカンダリインデックス(GSI)をスコアに設定し、クエリで降順にトップ 100 を取得する。
- C. Amazon RDS for PostgreSQL でスコアテーブルに B-tree インデックスを作成し、ORDER BY score DESC LIMIT 100 クエリを実行する。
- D. Amazon ElastiCache for Redis の Sorted Sets(ソート済みセット)を使ってリーダーボードを管理する。スコア更新は ZADD、トップ 100 取得は ZREVRANGE コマンドで O(log N) の計算量で実現する。
解答と解説を見る
正解: D
Redis の Sorted Sets(ソート済みセット)はリーダーボードの実装に最適化されたデータ構造である。ZADD でスコアを挿入・更新し(O(log N))、ZREVRANGE でトップ N を取得する操作が非常に高速(O(log N + M))で、インメモリ処理のためマイクロ秒単位のレイテンシーを実現できる。1 日数億件のリクエストにも ElastiCache のクラスター構成で対応できる。選択肢AのDynamoDB テーブルのスキャン操作はテーブル全体を読み取るため、大規模テーブルでは非常に遅く、コストも高い。また DynamoDB のソートキーの昇順/降順クエリはパーティション内でしか機能しない。選択肢BのGSI を使った DynamoDB クエリは改善だが、DynamoDB の GSI は同一パーティションキー内でしかソートできないため、全ユーザーのグローバルランキングには不適切(GSI パーティション設計が必要)。選択肢CのRDS は ACID 対応で強整合性があるが、数億リクエスト/日の負荷には ElastiCache のインメモリ処理より低性能で、スケールアップコストも高い。
📚 関連サービスの解説: Amazon ElastiCache