疎結合の非同期処理
キュー/イベント配信/ストリームで送信側と処理側を切り離し、スパイク吸収・リトライ・独立スケールを実現する Azure の定番パターン。
中級信頼性パフォーマンス効率コスト最適化
このパターンは?
重い処理や急増するリクエストを、直接同期呼び出しせずにいったん「間に箱を挟んで」捌く構成。Azure でのマイクロサービス設計でも頻出の「疎結合」パターンです。
- スパイクを**バッファ(負荷平準化)**して取りこぼさない
- 失敗を**リトライ/デッドレター(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 Bus | Event Grid | Event Hubs |
|---|---|---|---|
| 主な用途 | 業務メッセージの確実な引き渡し | イベントの通知・ファンアウト | ストリームの高速取り込み |
| 配信方式 | プル(受信側がポーリング) | プッシュ(HTTP で配信) | プル(オフセットで読み進める) |
| 取り出すと | 消える(Complete で削除) | (配信して完了) | 消えない(保持期間内は再読込可) |
| 順序保証 | FIFO / セッション | なし | パーティション内で保証 |
| 失敗時 | デッドレター(サブキュー) | リトライ + デッドレター(Blob) | 再読み込みで対応 |
| AWS 対応 | SQS(+ SNS) | SNS / EventBridge | Kinesis 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