【正解】D
【0からの解説】
①前提知識
・Firestore:フルマネージドでサーバーレスの NoSQL ドキュメント データベース。使った分だけ課金され、ゼロから大規模まで自動でスケールします。モバイル / ウェブ向け SDK にはオフライン永続化(デバイス上へのデータのキャッシュ)機能があり、オフライン中も読み書きでき、オンライン復帰時に自動同期されます。リアルタイム リスナーで変更を即座にクライアントへ配信できるため、チャットやフィード、スコアの更新表示にも向いています。
・Memorystore:Redis などのフルマネージドなインメモリ データストア。ソート済みセットによるランキング処理は高速ですが、容量(インスタンス サイズ)を事前にプロビジョニングして常時課金され、VPC 内からアクセスするサーバー側のキャッシュであり、ユーザーのデバイスでのオフライン キャッシュ機能はありません。
・BigQuery:サーバーレスなデータ ウェアハウス。大量のクリックストリームを取り込み、SQL で集計して BI ツールで可視化する用途に最適です。
・Spanner / Cloud SQL / Bigtable:それぞれグローバル RDB、マネージド RDB、大規模ワイドカラム NoSQL です。いずれもインスタンス(ノード)単位の容量計画が必要で、デバイス側のオフライン キャッシュは提供しません。
②要件と制約の整理
・ユーザー数の見込みがない → 事前の容量計画が不要で、使った分だけ払うサーバーレスが望ましい(費用対効果・スケーラビリティ)。
・使いやすい → 扱うサービスの種類が少なく、運用が簡単なほど良い。
・ユーザーのデバイス上でのオフライン キャッシュをサポート → アプリ側に表示するデータ(ランキング、プロフィール、チャット、フィード)は Firestore の SDK で実現できる。
・クリックストリームは BI 用 → 分析用ストアが必要。
③正解がどう満たすか
データ型 1(リーダーボード)とデータ型 2(プロフィール・チャット・ニュースフィード)をともに Firestore に置けば、1 つのサーバーレス データベースでアプリが表示するデータをすべて扱え、デバイス上のオフライン キャッシュとリアルタイム同期もそのまま使えます。ユーザー数が読めなくても自動でスケールし、使用量に応じた課金なので費用対効果も高くなります(Firebase のドキュメントでも Firestore によるリーダーボードの構築方法が紹介されています)。データ型 3 のクリックストリームは BigQuery に取り込み、BI 分析に使います。
・注意:リーダーボードといえば「Memorystore for Redis のソート済みセット(Sorted Set)で作る」のが定番で、場面の異なる類題ではそれが正解になることもあります。Redis はスコア順の並べ替えや順位の取得をミリ秒以下で行えるため、「大量のスコア更新をサーバー側で超低レイテンシに処理したい」ことが主眼の問題では Memorystore が最適です。
・この問題でリーダーボードを Firestore に置く決め手は、「ユーザーのデバイス上でのオフライン キャッシュをサポートする」という要件です。この要件はデータ型 1 にもかかっており、デバイス側のオフライン キャッシュを提供できるのは選択肢の中で Firestore(のクライアント SDK)だけです。さらに「ユーザー数の見込みがない」「使いやすい」という要件も、容量を事前確保する Memorystore より、サーバーレスで 1 つのデータベースにまとめられる Firestore に有利に働きます。問題文の要件を 1 つずつ各データ型に当てはめて確認することが大切です。
【誤りの選択肢】
A:データ型 2 と 3 は適切ですが、リーダーボードを Memorystore に置くと、この問題の決め手であるデバイス上のオフライン キャッシュの要件を満たせません(Memorystore は VPC 内のサーバー側からアクセスするキャッシュで、モバイル端末に直接データを持たせる機能はありません)。ランキング処理の速さは Memorystore の長所ですが、この要件を満たせない以上、選ぶことはできません。また Memorystore はインスタンス容量を事前に確保して常時課金されるため、ユーザー数の見込みがない段階では費用対効果が下がり、管理するサービスも 1 つ増えて「使いやすさ」でも D に劣ります。
B:Memorystore・Spanner・Bigtable はいずれもデバイス上のオフライン キャッシュを提供しません。Spanner と Bigtable はノード / 処理容量単位の課金で最低コストも高く、ユーザー数が不明な新規ゲームには過剰です。Bigtable は BI 用の SQL 分析には BigQuery ほど向いていません。
C:プロフィール・チャット・ニュースフィードを Cloud SQL に置くと、デバイス上のオフライン キャッシュやリアルタイム同期をアプリ側で自前実装する必要があり、インスタンスのサイズ管理も必要です。チャットのような書き込みの多いデータの大規模スケールにも向きません。
【参考】
オフライン データを有効にする | Firestore in Native modeFirestore の概要 | Firestore in Native modeBigQuery の概要