-
Notifications
You must be signed in to change notification settings - Fork 0
MS_CloudDesignPatterns
- まだ、ごく一部しか書けていない(オンデマンドで追記予定)。
-
クラウド アプリケーション アーキテクチャ ガイドや
参照アーキテクチャから
参照されているので知っておくと良い。
補足(なぜ「クラウド用の」パターンが要るのか): オンプレの設計と
決定的に違うのは、次の 2 点である。
前提 オンプレ クラウド 障害 例外的な事態 常に起きる(一時的障害が日常) リソース 固定(買った分) 伸縮する(従量課金) つまりクラウド設計パターンの多くは、
- 一時的な失敗を前提に、勝手に回復する(リトライ、サーキット ブレーカー)
- 負荷の波を吸収する(キュー、スロットル、スケール)
という 2 つの目的に集約される。
「落ちない前提」で作られたオンプレのコードをそのまま持ち込むと、
クラウドでは断続的な障害に悩まされることになる。
アプリケーションの可用性が最大限になるように設計・実装。
- 正常性エンドポイント監視
- 調整(絞り弁、スロットル)
- キュー ベースの負荷平準化
データの整合性を維持するため、様々な場所にあるデータを同期する。
| 分類 | パターン |
|---|---|
| 配置 | テーブルのインデックス作成 / マテリアライズド・ビュー / シャーディング |
| 操作 | イベント ソーシング / CQRS / 補正トランザクション |
| その他 | バレット キー / キャッシュ アサイド / 静的コンテンツ ホスティング |
- コンポーネントの設計
- デプロイの一貫性や統一性
- 管理および開発を容易にする保全性
- 再使用可能性
スケーラビリティを最大化する(非同期)メッセージング インフラストラクチャ。
課題も多数ある。
- メッセージの順序
- 有害メッセージ(poison message)の管理
- 冪等性
| 分類 | パターン |
|---|---|
| 基本 | 要求チェック / 非同期要求 - 応答 / 競合コンシューマー / 調整 |
| キュー | キュー ベースの負荷平準化 / 優先順位キュー / パブリッシャー/サブスクライバー / シーケンシャルなコンボイ |
| タスクの協調動作 | パイプとフィルター / Scheduler Agent Supervisor / コレオグラフィ |
補足(冪等性が最重要): メッセージングを使うと、
同じメッセージが 2 回届くことがある(at-least-once 配信)。
多くのマネージド キューは「厳密に 1 回」を保証しない。このため、受信側は
同じメッセージを 2 回処理しても結果が変わらない(冪等)ように
作らなければならない。
手法 内容 メッセージ ID の記録 処理済み ID をストアに残し、重複を捨てる UPSERT にする INSERT ではなく「あれば更新」 業務キーで判定 「注文番号 X は処理済み」で弾く 「送金を 2 回実行してしまった」という事故は、
ほぼこの考慮漏れから生じる。
アプリケーションの停止や再デプロイを行わずに、
変化するビジネス要件やカスタマイズに対応する。
| 分類 | パターン |
|---|---|
| ゲートウェイ | 集約 / オフロード / ルーティング |
| 監視 | 正常性エンドポイント監視 |
| システム間連系 | 破損対策レイヤー / ストラングラー |
| コンポーネント | アンバサダー / サイドカー |
| 構成 | 外部構成ストア |
補足(ストラングラー パターンが移行の要): レガシー システムの
段階的な置き換えで最もよく使われるパターンである。[利用者] ──> [ファサード(振り分け)] ─┬─> 新システム(少しずつ増やす) └─> 旧システム(少しずつ減らす)
- 前段に振り分けのファサードを置く。
- 機能を 1 つずつ新システムに移し、振り分け先を切り替える。
- 旧システムの担当が無くなったら撤去する。
「一斉に切り替える(ビッグバン移行)」を避けられる点が最大の利点で、
ASP.NET Coreへの移行のような
大規模な移行でも有効に使える。
名前は「絞め殺しイチジク(strangler fig)」に由来する。
- 要求のピークに対応するスケールアウト
- 要求が減少したときのスケールイン
一時的な障害からの自動回復。
補足(リトライだけでは足りない): 一時的障害への対処は
リトライ + サーキット ブレーカーの組み合わせが基本である。
パターン 目的 Retry 一時的な失敗(瞬断・スロットリング)から回復する Circuit Breaker 継続的な失敗のとき、呼ぶのを止める Timeout 応答が返らない相手に引きずられない Bulkhead 障害を局所化する(リソースを区画に分ける) Fallback 失敗時の代替応答(キャッシュ値など) リトライだけを実装すると、障害中の相手に負荷をかけ続け、
復旧を妨げる(リトライ ストーム)。
サーキット ブレーカーで「しばらく諦める」ことが必要になる。
.NET では Polly(現在はMicrosoft.Extensions.Http.Resilience)で
これらをまとめて構成できる。
- フェデレーション ID(クレームベース認証)
- バレット キー
- ゲートキーパー
| パターン | 一言でいうと |
|---|---|
| キャッシュ アサイド | 読むとき:キャッシュに無ければ DB から読んで入れる |
| CQRS | 読み取り用と書き込み用でモデルを分ける |
| イベント ソーシング | 状態ではなくイベントの列を保存する |
| 補正トランザクション | 分散環境で取り消し処理を明示的に書く(Saga) |
| キュー ベースの負荷平準化 | 前段にキューを置いてピークを均す |
| 競合コンシューマー | 1 つのキューを複数のワーカーで取り合う(スケールアウト) |
| サイドカー | 補助機能を別コンテナに切り出す(ログ、プロキシ) |
| ゲートキーパー | 前段に検証専用のインスタンスを置く |
| バレット キー | 限定的な権限のトークンを発行して直接アクセスさせる(SAS) |
補足(バレット キーの実例): 「バレット キー(valet key、
ホテルの係員に渡す鍵)」は名前が分かりにくいが、
Azure Storage の SAS(Shared Access Signature) がまさにこれである。[クライアント] ──① SAS を要求──> [アプリ] └────② SAS で直接アップロード────> [Blob Storage]大きなファイルをアプリ サーバー経由で中継すると、
帯域とメモリを無駄に消費する。
期限・権限を絞ったトークンを渡し、
ストレージへ直接アクセスさせることでこれを避ける。
-
クラウド デザイン パターン
https://learn.microsoft.com/azure/architecture/patterns/ -
一時的な障害の処理
https://learn.microsoft.com/azure/architecture/best-practices/transient-faults -
再試行パターン / サーキット ブレーカー パターン
https://learn.microsoft.com/azure/architecture/patterns/retry
Tags: 移行, アーキテクチャ, クラウド, Azure, 設計のポイント
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。