Azure非リレーショナル応用

あるリアルタイムチャットアプリケーションがCosmos DB(Core SQL API)を使用して、メッセージを管理しています。ユーザーが新しいメッセージを送信する際、「送信者ID」「受信者ID」「タイムスタンプ」をパーティションキーとして設定しました。このパーティション戦略のために、「特定の2人のユーザー間の過去30日間のメッセージを時系列で取得」というクエリ性能が低下しました。最も根本的な原因と改善案はどれか?

A.パーティションキーが複合キーで複雑すぎる。単一のパーティションキー「タイムスタンプ」に変更すればホットパーティション問題が解決する
✗ タイムスタンプをパーティションキーにすると、時間軸で均等に分散しない(ホットパーティション化)。また受信者IDを含めない設計では、特定の2人の会話を効率的に取得できない。
B.パーティションキーが「送信者ID」「受信者ID」「タイムスタンプ」と粒度が細かすぎ、物理パーティション間のクロスパーティションクエリが発生している。パーティションキーを「受信者ID」(または「会話ID」)に統一すべき← 正解
✓ 正解です。複合パーティションキーが細かすぎると、同じ論理グループ(2人の会話)が複数の物理パーティションに散らばり、クロスパーティションクエリのコストが増加します。パーティションキーを「会話ID」に統一することで、同一会話のメッセージが同一パーティション内に集約されます。
C.Cosmos DBの一貫性レベルが「強い一貫性」に設定されており、クエリのレイテンシが増加している。整合性レベルを「最終的一貫性」に変更すれば改善する
✗ 一貫性レベルは総スループットに影響しますが、同一パーティション内クエリの効率改善には直結しません。根本原因はパーティション設計です。
D.RU(要求ユニット)の割り当てが不足している。メッセージコンテナーのスループット容量を10,000RU/sに増やせば、すべてのクエリが高速化する
✗ RU増加は別のスケーリング手段ですが、物理パーティション間のクロスパーティションクエリの高コストを根本解決できません。パーティション設計が不適切では、RUの浪費が続きます。

この問題のポイント

複合パーティションキーが細かすぎると、同じ論理グループ(2人の会話)が複数の物理パーティションに散らばり、クロスパーティションクエリのコストが増加します。パーティションキーを「会話ID」に統一することで、同一会話のメッセージが同一パーティション内に集約されます。

DP-900:Microsoft Azure Data Fundamentals の問題一覧