TL

疎結合の非同期処理

キュー/イベント配信/ストリームで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Azure の定番パターン。

中級信頼性パフォーマンス効率コスト最適化

このパターンは?

重い処理や急増するリクエストを、直接同期呼び出しせずにいったん「間に箱を挟んで」捌く構成。Azure でのマイクロサービス設計でも頻出の「疎結合」パターンです。

  • スパイクを**バッファ(負荷平準化)**して取りこぼさない
  • 失敗を**リトライ/デッドレター(DLQ)**で安全に退避
  • 送信側と処理側を独立にスケール
受付APIが大きなデータをBlob Storageへ保存し、Event Gridから複数のService Busキューへ配信し、独立したワーカーが処理する正常系と、再試行、DLQ、再投入の障害経路を示す構成図
受付APIは要求を永続化して早く応答し、Event Gridで処理系ごとに配り、Service Busでスパイクを吸収します。ワーカーは業務更新後にCompleteし、一時失敗は再配信、規定回数を超えたメッセージはDLQへ隔離して調査後に再投入します。

構成

[フロント/Producer]
   │ イベント発生
   ▼
Event Grid (同報) ──► 複数の Service Bus キュー ──► ワーカー(Functions / Container Apps) ──► Cosmos DB / Blob
                          │
                          └─ 失敗 ─► デッドレター(退避)

別解1: Service Bus トピック/サブスクリプション (SQL フィルターで宛先別ルーティング)
別解2: Event Hubs (高スループットなストリーム取り込み・複数コンシューマーグループ)

コンポーネントの役割と使い分け

  • Service Bus / Queue Storage: バッファ。ワーカーがポーリングし、PeekLock(ロック)デッドレターで確実に処理。順序や重複検出が要るなら Service Bus
  • Event Grid: 1イベントを複数へプッシュで同報(ファンアウト)。Azure 内部イベント(Blob 作成など)への反応や SaaS 連携も。Event Grid → 複数の Service Bus キューが鉄板
  • Event Hubs: ログ・テレメトリを毎秒数百万件規模で取り込むストリーム。コンシューマーグループで複数処理系が同じストリームを並行読み取り
  • ワーカー: Functions(短時間・イベント駆動)/ Container Apps(長時間・常駐・KEDA でキュー長スケール)
Event Grid + Service Bus ファンアウト

「複数システムに同報」かつ「各処理を確実に」なら Event Grid → 複数の Service Bus キュー。Event Grid でプッシュ配信し、各キューがバッファ&リトライ&デッドレターを担います。Event Grid 自身も配信失敗時はリトライ+デッドレター(Blob)を持ちます。

設計の勘所

  • 処理は冪等に(Service Bus / Event Grid とも既定は**最低1回(at-least-once)**配信=重複し得る)
  • 厳密な順序が要るなら Service Bus のセッション、送信側の再送由来の重複には重複検出
  • ワーカーは**キューの長さ(ActiveMessages)**で自動スケール(Container Apps の KEDA、Functions の Scale Controller)
  • 大きいペイロードは Blob Storage に置き、メッセージには参照を入れる(Claim-Check パターン
  • 「業務処理の確実な引き渡し」は Service Bus、「事実の通知・配布」は Event Grid、「高スループットなストリーム取り込み」は Event Hubs と要件で選ぶ

Well-Architected の観点

  • 信頼性: バッファ・リトライ・デッドレターで取りこぼさない。PeekLock + Complete で処理完了まで削除しない
  • パフォーマンス効率: 送信/処理を独立スケール。Event Hubs のパーティションで並列度を確保
  • コスト最適化: 必要な時だけ処理。Functions 消費プランや Container Apps のゼロスケールでアイドル課金を止める

よくある落とし穴

アンチパターン
  • 同期呼び出しのまま重い処理を実行し、フロントがタイムアウト
  • 冪等性を考えず、重複メッセージで二重課金/二重登録
  • MaxDeliveryCount やデッドレターを設定せず、ポイズンメッセージが無限リトライ or 消失
  • 接続文字列(SAS キー)を直書き。マネージド ID + Entra ID/RBAC に寄せる

選び方の早見表

やりたいこと選ぶもの
バッファして確実に1対1で処理(順序・重複検出・トランザクション)Service Bus キュー
とにかく安く大量にためるシンプルなキューQueue Storage
1イベントを複数へ同報/Azure 内部イベントに反応Event Grid(+複数の Service Bus キュー)
宛先別にルーティング(フィルター)して確実に引き渡しService Bus トピック/サブスクリプション
毎秒数百万件のストリーム取り込み・再読み込み・並行処理Event Hubs

メッセージング3兄弟の違い

Azure には目的の異なる3つの非同期基盤があり、混同しやすい点です。

観点Service BusEvent GridEvent Hubs
主な用途業務メッセージの確実な引き渡しイベントの通知・ファンアウトストリームの高速取り込み
配信方式プル(受信側がポーリング)プッシュ(HTTP で配信)プル(オフセットで読み進める)
取り出すと消える(Complete で削除)(配信して完了)消えない(保持期間内は再読込可)
順序保証FIFO / セッションなしパーティション内で保証
失敗時デッドレター(サブキュー)リトライ + デッドレター(Blob)再読み込みで対応
AWS 対応SQS(+ SNS)SNS / EventBridgeKinesis Data Streams

Azure Pattern

疎結合の非同期処理を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

reliability

比較で見る軸

クラウド: Azure / 難易度: intermediate / 関連サービス: 7件

導入後に効く点

キュー/イベント配信/ストリームで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Azure の定番パターン。

先に潰すリスク

パターンをそのまま写すのではなく、可用性、権限、ネットワーク境界、運用手順を自分の要件に合わせる必要がある。

数字・仕様の読み方
クラウド
Azure
難易度
intermediate
関連サービス
7件
設計柱
reliability / performance / cost

判断チェックリスト

  • 自社の用途が「reliability / performance」に近いか確認する。
  • 強みである「キュー/イベント配信/ストリームで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Azure の定番パターン。」が本当に評価軸になるか確認する。
  • 注意点の「パターンをそのまま写すのではなく、可用性、権限、ネットワーク境界、運用手順を自分の要件に合わせる必要がある。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

reliabilityperformancecostAzure Service Bus / Queue StorageAzure Event GridAzure Event HubsAzure FunctionsAzure Container Apps / AKS