疎結合の非同期処理
Pub/Sub やイベントで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Google Cloud の定番パターン。
中級信頼性パフォーマンス効率コスト最適化
このパターンは?
重い処理や急増するリクエストを、直接同期呼び出しせずにいったん「間にメッセージング基盤を挟んで」捌く構成。Google Cloud で疎結合を組むときの基本形です。
- スパイクを バッファ して取りこぼさない
- 失敗を リトライ/デッドレター で安全に退避
- 送信側(Producer)と処理側(Worker)を 独立にスケール
構成
[フロント/Producer]
│ メッセージ発行
▼
Pub/Sub トピック ──► サブスクリプション ──► ワーカー(Cloud Run / Cloud Functions) ──► Firestore / Cloud Storage
│ (1トピック→複数サブスクで同報) │
│ └─ 失敗 ─► デッドレタートピック(退避)
▼
別のサブスクリプション ──► 別ワーカー
別解: Eventarc (GCP イベントを CloudEvents で受けてルーティング) ──► 各ターゲット
コンポーネントの役割と使い分け
- Pub/Sub: バッファ兼ファンアウト。1トピック→1サブスクで SQS 的なキュー、1トピック→複数サブスクで SNS 的な同報を1サービスで両立。ack 期限とデッドレタートピックで確実に処理
- Eventarc: Cloud Storage の書き込みや Audit Log などの GCP イベントを CloudEvents 形式でルーティング。内部実装は Pub/Sub
- ワーカー: Cloud Run / Cloud Functions(コンテナ/関数でスケール to ゼロ)。push サブスクで HTTP 起動、pull サブスクで自前ポーリング
- 保存先: Firestore(サーバーレス NoSQL)/ Cloud Storage(大きな成果物)
Pub/Sub 1本でキューもファンアウトも
AWS のように SQS と SNS を使い分けず、Pub/Sub のトピックとサブスクリプションの数で表現します。「複数システムに同報」かつ「各処理を確実に」なら、1トピックに対しシステムごとにサブスクリプションを作成。各サブスクが独立してバッファ・リトライ・デッドレターを担います。
設計の勘所
- 処理は 冪等 に(Pub/Sub の既定は at-least-once 配信=重複し得る)。重複が困るなら exactly-once delivery を有効化したサブスクを使う
- 厳密な順序が要るなら ordering key を付けて発行(同一キー内で順序保証)。順序付きストリーム分析なら Pub/Sub + Dataflow
- ワーカーの自動増減は、push なら Cloud Run / Functions が リクエスト数で自動スケール、pull なら 未処理メッセージ数(バックログ) を見てスケールさせる
- 大きいペイロードは Cloud Storage に置き、メッセージには オブジェクト参照(gs:// パス) だけを入れる(Pub/Sub のメッセージ上限は 10MB)
ack 期限の調整
ワーカーの処理が ack 期限(acknowledgement deadline) を超えると、Pub/Sub はメッセージを未達とみなして再配信します。長い処理では ack 期限を延ばすか、処理中に期限を延長(modifyAckDeadline)してください。短すぎると無駄な再配信と二重処理を招きます。
Well-Architected の観点
- 信頼性: バッファ・リトライ・デッドレタートピックで取りこぼさない
- パフォーマンス効率: 発行側と処理側を独立スケール、スパイクを吸収
- コスト最適化: ワーカーは スケール to ゼロ。必要な時だけ処理し、スパイクに過剰投資しない
よくある落とし穴
アンチパターン
- 同期 HTTP のまま重い処理を実行し、フロントがタイムアウト
- 冪等性を考えず、再配信されたメッセージで二重課金/二重登録
- デッドレタートピック未設定 で、失敗メッセージが最大配信回数まで延々と再試行 or 消失
- ペイロードを丸ごとメッセージに詰めて 10MB 上限に当たる
選び方の早見表
| やりたいこと | 選ぶもの |
|---|---|
| バッファして1対1で処理(キュー) | Pub/Sub(1トピック→1サブスク) |
| 1メッセージを複数へ同報(ファンアウト) | Pub/Sub(1トピック→複数サブスク) |
| GCP のイベントで振り分け/監査ログ連携 | Eventarc |
| 順序付き・ストリーム集計・リアルタイム分析 | Pub/Sub + Dataflow |
AWS との対応(疎結合まわり)
| 役割 | Google Cloud | AWS |
|---|---|---|
| キュー(バッファ) | Pub/Sub(1→1サブスク) | SQS |
| ファンアウト(同報) | Pub/Sub(1→複数サブスク) | SNS(+複数SQS) |
| イベントルーティング | Eventarc | EventBridge |
| 短時間ワーカー | Cloud Functions | Lambda |
| 常駐/コンテナワーカー | Cloud Run | ECS / Fargate |
| 退避先 | デッドレタートピック | DLQ |
Google Cloud Pattern
疎結合の非同期処理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
reliability
比較で見る軸
クラウド: Google Cloud / 難易度: intermediate / 関連サービス: 7件
導入後に効く点
Pub/Sub やイベントで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Google Cloud の定番パターン。
先に潰すリスク
パターンをそのまま写すのではなく、可用性、権限、ネットワーク境界、運用手順を自分の要件に合わせる必要がある。
数字・仕様の読み方
- クラウド
- Google Cloud
- 難易度
- intermediate
- 関連サービス
- 7件
- 設計柱
- reliability / performance / cost
判断チェックリスト
- 自社の用途が「reliability / performance」に近いか確認する。
- 強みである「Pub/Sub やイベントで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Google Cloud の定番パターン。」が本当に評価軸になるか確認する。
- 注意点の「パターンをそのまま写すのではなく、可用性、権限、ネットワーク境界、運用手順を自分の要件に合わせる必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。
次に確認する観点
reliabilityperformancecostPub/SubEventarcCloud Run / GKECloud Functions / Cloud RunFirestore / Bigtable