TL

疎結合の非同期処理

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 CloudAWS
キュー(バッファ)Pub/Sub(1→1サブスク)SQS
ファンアウト(同報)Pub/Sub(1→複数サブスク)SNS(+複数SQS)
イベントルーティングEventarcEventBridge
短時間ワーカーCloud FunctionsLambda
常駐/コンテナワーカーCloud RunECS / 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