PCDBE 合格対策
🔬 DEEP DIVE

Firestore / Memorystore ディープダイブ

公式ドキュメントに基づく、Firestore Native / Datastore / MongoDB-compatible 3 モードの違いと、Memorystore (Redis / Memcached / Valkey) の選定深掘り。

📑 目次

  1. 1. Firestore の 3 モード
  2. 2. Native モード — Real-time + Offline
  3. 3. MongoDB-compatible モード
  4. 4. Firestore の制限値と落とし穴
  5. 5. Memorystore 全エンジン概観
  6. 6. Redis の Tier と制約
  7. 7. Memcached / Valkey
  8. 8. キャッシュデザインパターン
  9. 9. 試験頻出のひっかけ

1. Firestore の 3 モード

モードデータモデルAPIリアルタイムオフライン推奨
Native Document / Collection Firestore v1 対応 対応 新規アプリ
Datastore Entity / Kind Datastore v1 非対応 非対応 レガシー互換のみ
MongoDB-compatible BSON Document MongoDB Wire Protocol 対応 クライアント次第 MongoDB アプリ移行
Google 公式の推奨は 「新規アプリは Native モード」。Datastore モードは旧 App Engine 用の互換層で、新規開発では選ぶ理由はほぼない。
モードはプロジェクト/データベース作成時に決定し、後から変更不可

2. Native モード — Real-time + Offline

Firestore Native の最大の強み:
  1. Real-time listeners: クライアントがドキュメントを subscribe すると、変更があった瞬間にサーバーから push される
  2. オフライン永続化: モバイル/Web SDK は自動でローカルキャッシュ。ネット断中も書き込み可、復帰後に同期
  3. Security Rules: バックエンド不要で「このユーザーはこのドキュメントを読めるか」を宣言的に定義

データモデル

Collection (users) ├── Document (user_id: alice) │ ├── name: "Alice" │ ├── age: 30 │ └── Subcollection (orders) │ ├── Document (order_id: 1) {...} │ └── Document (order_id: 2) {...} └── Document (user_id: bob) {...} ※ SubCollection で階層化、最大 100 階層

整合性

Firestore Native は強整合性(Strong consistency)を提供する。トランザクション内で複数ドキュメントの読み書きを atomic に実行可能。

「500/50/5 ルール」: 新規 Collection への持続的な書き込みレートは「500 ops/sec」が初期上限。これを 5 分毎に 50% ずつ増加して目標値へ到達する設計が推奨。一気に高 QPS で書き込むと制限される。

3. MongoDB-compatible モード

2024年に GA された比較的新しいモード。MongoDB Wire Protocol で接続できるため、既存 MongoDB アプリのコード変更ゼロで移行可能。

対応するクライアント: 対応していない機能の例:

4. Firestore の制限値と落とし穴

ドキュメント最大サイズ
1 MiB
超えるなら GCS + URL
Collection 持続書込
500/s
初期上限
Multi-region SLA
99.999%
nam5, eur3, asia1
PITR 最大
7 日
秒単位指定
Firestore の課金は「読み書きオペレーション数」。listener も「クエリ + 受信ドキュメント数」でカウントされるため、頻繁にリスナーを張りなおすコードは課金爆発のリスク。

Native vs Datastore の細かい違い

項目NativeDatastore
APIFirestore v1Datastore v1
クライアント言語多数(モバイル含む)サーバー中心
セキュリティIAM + Security RulesIAM のみ
Ancestor クエリ制限なし従来あり(解消済み)
1 グループ書込制限なし従来 1/sec(解消済み)
Real-timeありなし

5. Memorystore 全エンジン概観

エンジン特徴HA主用途
Memorystore for Redis 多機能、データ構造、Pub/Sub、Lua Standard Tier で HA キャッシュ + リーダーボード + Pub/Sub軽量
Memorystore for Memcached シンプル KV、永続化なし クラスタ構成のみ 純粋キャッシュ、最大スループット
Memorystore for Valkey Redis フォーク(OSS)、Redis 互換 クラスタ標準 新規 OSS 戦略、Redis 7+ 互換
Memorystore for Redis Cluster Redis Cluster プロトコル 標準で HA + シャード >300GB 大規模 Redis

6. Redis の Tier と制約

項目Basic TierStandard TierCluster
Replicationなしあり (cross-zone)あり (シャード内)
自動フェイルオーバーなしありあり
SLAなし99.9%99.9%
Read Replica-最大 5シャード毎
最大容量300 GB300 GB14.4 TiB
用途キャッシュのみ・再起動でデータ消失 OK本番標準大規模本番
永続化: Memorystore は RDB スナップショットのみ対応。AOF (Append-Only File) 非対応
→ OSS Redis に慣れていると AOF を期待しがちだが、Memorystore は RDB エクスポートのみ。
Basic Tier はデータ消失リスク。再起動・スケール変更でメモリ上のデータは全消失する。「キャッシュとして再構築可能」な用途以外では使うべきではない。

ブロックされている Redis コマンド

マネージドサービスの安定性のため、いくつかの Redis コマンドはブロックされている。

ブロック例: - CONFIG SET (一部のみ許可) - CLUSTER FAILOVER - DEBUG - REPLICAOF / SLAVEOF - SHUTDOWN - MIGRATE - SAVE / BGSAVE (export 機能経由のみ) → OSS Redis 用ツールが動かない可能性あり、要事前検証

7. Memcached / Valkey

Memorystore for Memcached

Memorystore for Valkey

Redis 7.x のフォーク。OSS コミュニティで開発が活発化しており、Google Cloud も注力。Redis 互換クライアントがそのまま使える。新規プロジェクトで ライセンス制約を避けたい場合の選択肢

8. キャッシュデザインパターン

パターン1: Cache-Aside (Lazy Loading)

アプリ ─ ① Read ──► Memorystore Redis │ (Hit) → 返却 (Miss) │ ② Read ──► Cloud SQL ③ Write Back ──► Redis (TTL 設定) ④ 返却

パターン2: Write-Through

アプリ ─ ① Write ──► Cloud SQL + Redis 同時更新 メリット: キャッシュが常に最新 デメリット: 書き込みレイテンシ増加

パターン3: Write-Behind (Write-Back)

アプリ ─ ① Write ──► Redis │ (非同期) ──► Cloud SQL メリット: 書き込み高速 デメリット: データロスリスク (Basic Tier では危険)
試験での典型シナリオ:

9. 試験頻出のひっかけ

問題NG 回答正解
MongoDB アプリ + Wire Protocol 互換 Bigtable / Spanner Firestore MongoDB-compatible / MongoDB Atlas
モバイル + オフライン + リアルタイム Cloud SQL Firestore Native
リーダーボード(TOP100 ソート) Cloud SQL ORDER BY Memorystore Redis Sorted Set
1 セッション 5 MB のオブジェクト保存 Firestore Document GCS + URL を Firestore に格納(1MiB 超)
Memorystore で AOF 永続化 有効化 対応していない(RDB のみ)
HA 必須のキャッシュ Basic Tier Standard Tier (or Cluster)
公式参考リソース