「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>アーキテクチャ設計]] * 目次 [#j8805eae] #contents *概要 [#d012c3e3] -まだ、ごく一部しか書けていない(オンデマンドで追記予定)。 -[[ガイドライン>クラウド アプリケーション アーキテクチャ ガイド]] や [[参照アーキテクチャ]]から参照されているので知っておくと良い。 *詳細 [#x8291193] **カテゴリ [#zeb8a6a4] ***可用性 [#i63267d2] -アプリケーションの可用性が最大限になるように設計・実装。 -パターン --[[正常性エンドポイント監視>#r913f362]] --[[調整(絞り弁、スロットル)>#r5f048d8]] --[[キュー ベースの負荷平準化>#m8158a06]] ***データ管理 [#e03b2289] -データの整合性を維持するため、~ 様々な場所にあるデータを同期する。 -パターン --配置 ---[[テーブルのインデックス作成>#q19a433d]] ---[[マテリアライズド・ビュー>#t9eed998]] ---[[シャーディング>#i8ed3766]] --操作 ---[[イベント ソーシング>#gd32eb7b]] ---[[コマンド クエリ責務分離 (CQRS)>#z972b50e]] ---[[補正トランザクション>#d113b16e]] --その他 ---[[バレット キー>#i4f422e4]] ---[[キャッシュ アサイド>#gb491759]] ---[[静的コンテンツ ホスティング>#t2f1a55e]] ***設計と実装 [#r9cb5e6b] -コンポーネントの設計 -デプロイの一貫性や統一性 -管理および開発を容易にする保全性 -再使用可能性 -パターン --...。 ***メッセージング [#td14fd2d] -スケーラビリティを最大化する~ (非同期)メッセージング インフラストラクチャ -課題も多数ある。 --メッセージの順序 --有害メッセージの管理 --冪等性 -パターン --[[要求チェック>#vbc37c90]] --[[非同期要求 - 応答>#i947e3b1]] --[[競合コンシューマー>#adeadf05]] --[[調整(絞り弁、スロットル)>#r5f048d8]] --キュー ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[優先順位キュー>#tf045f04]] ---[[パブリッシャー/サブスクライバー>#we34db20]] ---[[シーケンシャルなコンボイ>#n889f92a]] -タスクの協調動作 --[[パイプとフィルター>#d56122e0]] --[[Scheduler Agent Supervisor>#d9b6b869]] --[[コレオグラフィ>#z41a1a75]] ***管理と監視 [#tbba2978] -アプリケーションの停止や再デプロイを行わずに、~ 変化するビジネス要件やカスタマイズに対応する。 -パターン --[[ゲートウェイ>#o7cb8518]] ---集約 ---オフロード ---ルーティング --[[正常性エンドポイント監視>#r913f362]] --システム間連系 ---[[破損対策レイヤー>#ee356f31]] ---[[ストラングラー>#gb7104aa]] --コンポーネント ---[[アンバサダー>#kd47d078]] ---[[サイドカー>#kf9fc0f6]] --[[外部構成ストア>#g6bdf9c1]] ***パフォーマンスと拡張性 [#w039903b] -以下の要件に対応 --要求のピークに対応するスケールアウト --要求が減少に対応するスケールイン -以下の要素と関係がある。 --[[データ ストレージ>#e03b2289]] --[[メッセージング インフラストラクチャ>#td14fd2d]] -パターン --[[調整(絞り弁、スロットル)>#r5f048d8]] --データ配置 ---[[テーブルのインデックス作成>#q19a433d]] ---[[マテリアライズド・ビュー>#t9eed998]] ---[[シャーディング>#i8ed3766]] --非同期タスク ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[優先順位キュー>#tf045f04]] ---[[イベント ソーシング>#gd32eb7b]] ---[[コマンド クエリ責務分離 (CQRS)>#z972b50e]] ---[[コレオグラフィ>#z41a1a75]] --その他 ---[[キャッシュ アサイド>#gb491759]] ---[[静的コンテンツ ホスティング>#t2f1a55e]] ***回復性 [#m9fc9b20] -迅速かつ効率的に障害を検出して復旧する。 -パターン --[[正常性エンドポイント監視>#r913f362]] --[[Polly系>#t4755eb8]] ---Retry ---Circuit Breaker ---Timeout ---Bulkhead ---Fallback --非同期タスクと補正 ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[リーダー選定>#b5489904]] ---[[Scheduler Agent Supervisor>#d9b6b869]] ---[[補正トランザクション>#d113b16e]] ***セキュリティ [#sd3af2e4] -悪意のある攻撃からの保護 -機密データの保護 -ユーザ認証と認可(アクセス制御) -パターン --[[ゲートキーパー>#r1236eb8]] --[[バレット キー>#i4f422e4]] --[[フェデレーション ID>#x070c362]] **カタログ [#v1bfce15] ***フロントエンド用バックエンド [#f9d59953] -[[個別サービス・インターフェイス>https://opentouryo.osscons.jp/index.php?%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%BB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9#z6b5bb47]]的な。 -関連のあるパターンとガイダンス --パターン ---[[ゲートウェイ(集約 / オフロード / ルーティング)>#o7cb8518]] ***[[ゲートキーパー>Web/APの分離#eaab229f]] [#r1236eb8] -関連のあるパターンとガイダンス --パターン ---[[バレット キー>#i4f422e4]] ***ゲートウェイ(集約 / オフロード / ルーティング) [#o7cb8518] -[[API Gateway]]のような。 -関連のあるパターンとガイダンス --パターン ---集約 ⇔ オフロード ⇔ ルーティング ---[[フロントエンド用バックエンド>#f9d59953]] ---[[Polly(Retry, Circuit Breaker, Timeout, Bulkhead, Fallback)>#t4755eb8]] ***要求チェック [#vbc37c90] -大きいメッセージを要求チェックとペイロードに分割 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/claim-check ***正常性エンドポイント監視 [#r913f362] 公開されたエンドポイントを通じて外部ツールが定期的に~ アクセスできる機能チェックをアプリケーションに実装。 -HTTP/HTTPS ヘルスチェック的な手法で確認する。 -管理下で無いので、こんな方法しか無いらしい。 -考慮点 --認証 --負荷 --専用エンドポイントの新設 --, etc. -関連のあるパターンとガイダンス --インストルメンテーション ---アプリケーション実行時の挙動の監視 ---ある種のインシデント改善を自動化 --メトリック アラート通知の受信~ メトリック アラートを作成、表示(受信)、管理 --[[メトリック アラート>Azure Alerts]]通知の受信~ [[メトリック アラート>Azure Alerts]]を作成、表示(受信)、管理 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/health-endpoint-monitoring ***競合コンシューマー [#adeadf05] -受ける側で"調整"するパターン -具体例は、[[後述>#m8158a06]]の「非同期処理サービス」。 -関連のあるパターンとガイダンス --パターン ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[コンピューティング リソース統合>#h0efa234]] --[[自動スケール>クラウド アプリケーション アーキテクチャ ガイド#x277761f]](アーキ・ガイド) -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/competing-consumers ***調整(絞り弁、スロットル) [#r5f048d8] -受ける側で"制限"するパターン --絞り弁 = Throttle (スロットル) --[[slow_down>CIBA(Client Initiated Backchannel Authentication)#z70c2acf]]とか、リクエスト自体を拒否するとか。 -アプリケーションの --インスタンス --個々のテナント --またはサービス全体によって使用されるリソース >の使用量を制御する。 -関連のあるパターンとガイダンス --パターン ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[優先順位キュー>#tf045f04]] --([[前述>#r913f362]]の)インストルメンテーション --サービス・メータリング~ 使用しているリソースの計測 --[[自動スケール>クラウド アプリケーション アーキテクチャ ガイド#x277761f]](アーキ・ガイド) ***[[Polly(Retry, Circuit Breaker, Timeout, Bulkhead, Fallback)]] [#t4755eb8] -詳しくは、[[Polly>Polly(Retry, Circuit Breaker, Timeout, Bulkhead, Fallback)]]の項を参照 -関連のあるパターンとガイダンス --Retry ⇔ Circuit Breaker ⇔ Bulkhead --[[正常性エンドポイント監視>#r913f362]] --[[調整(絞り弁、スロットル)>#r5f048d8]] ***非同期要求 - 応答 [#i947e3b1] -HTTP ポーリングを使用 -ポートを開いて非同期コールバックを受信出来ない場合。 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/async-request-reply ***キュー ベースの負荷平準化 [#m8158a06] タスクとそのタスクが呼び出すサービスとの間で~ キューを使用して、断続的な大きい負荷を平準化する。 -[[非同期処理サービス>https://opentouryo.osscons.jp/index.php?%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9]]でやってるようなことをやれという話。~ (「"非同期処理サービス"を使え。」とは言っていない) -関連のあるパターンとガイダンス --パターン ---[[競合コンシューマー>#adeadf05]] ---[[調整(絞り弁、スロットル)>#r5f048d8]] --[[メッセージング サービスの選択>クラウド アプリケーション アーキテクチャ ガイド#g243b803]](アーキ・ガイド) --[[スケーラビリティの向上>参照アーキテクチャ#z6ed15db]](参照アーキ) ***優先順位キュー [#tf045f04] -[[キュー ベースの負荷平準化>#m8158a06]]に加え、 -優先順位の高い順に受信・処理されるようにする。 -関連のあるパターンとガイダンス --パターン ---[[競合コンシューマー>#adeadf05]] ---[[調整(絞り弁、スロットル)>#r5f048d8]] --[[自動スケール>クラウド アプリケーション アーキテクチャ ガイド#x277761f]](アーキ・ガイド) -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/priority-queue ***パブリッシャー/サブスクライバー [#we34db20] -Microsoft Message Queue (MSMQ)等にあった。 -[[レプリケーション>SQL Server のレプリケーション]]でも利用されている。 -関連のあるパターンとガイダンス --パターン ---オブザーバー パターン ---メッセージ ブローカー パターン。 --アーキ・ガイド ---[[イベント ドリブン アーキテクチャ>クラウド アプリケーション アーキテクチャ ガイド#i151f65f]] ---[[メッセージング サービスの選択>クラウド アプリケーション アーキテクチャ ガイド#g243b803]] ***シーケンシャルなコンボイ [#n889f92a] -メッセージをキュー システム内のカテゴリにプッシュ -キュー リスナーが 1 つのカテゴリから一度に 1 つずつロックしてプル -異なるカテゴリのメッセージがインターリーブされる場合がある。 ***テーブルのインデックス作成 [#q19a433d] -[[SQL Server のインデックス]] -セカンダリ・インデックスの無い~ [[NoSQL>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?NoSQL]]ではインデックス・テーブルを作成 -関連のあるパターンとガイダンス --パターン ---[[シャーディング>#i8ed3766]] ---[[マテリアライズド・ビュー>#t9eed998]] ***マテリアライズド・ビュー [#t9eed998] -コレは知ってるでしょ? -関連のあるパターンとガイダンス --パターン ---[[テーブルのインデックス作成>#q19a433d]] ---[[シャーディング>#i8ed3766]] ---[[イベント ソーシング>#gd32eb7b]] ---[[コマンド クエリ責務分離 (CQRS)>#z972b50e]] ***シャーディング [#i8ed3766] -[[Elastic Scale, Elastic Database Pool]] -関連のあるパターンとガイダンス --パターン ---[[テーブルのインデックス作成>#q19a433d]] ---[[マテリアライズド・ビュー>#t9eed998]] --[[データのパーティション分割>クラウド アプリケーション アーキテクチャ ガイド#c1a7c7a9]](アーキ・ガイド) ***イベント ソーシング [#gd32eb7b] -以下のようなパターン --追加処理の専用ストアを用意し、 --[[Apache NiFi>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Apache%20NiFi]]を使ってデータをエントリし、 --バッチで[[データレイク → データマート>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?%E3%83%93%E3%83%83%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF#o2e72d99]]へ。 >※ もっと業務要素が加わっているモノもある。 -関連のあるパターンとガイダンス --パターン ---[[マテリアライズド・ビュー>#t9eed998]] ---[[コマンド クエリ責務分離 (CQRS)>#z972b50e]] ---[[補正トランザクション>#d113b16e]] --[[データのパーティション分割>クラウド アプリケーション アーキテクチャ ガイド#c1a7c7a9]](アーキ・ガイド) ***コマンド クエリ責務分離 (CQRS) [#z972b50e] -データ ストアの読み取り操作と更新操作のデータ モデルを分離 -関連のあるパターンとガイダンス --パターン ---[[マテリアライズド・ビュー>#t9eed998]] ---[[イベント ソーシング>#gd32eb7b]] --[[データのパーティション分割>クラウド アプリケーション アーキテクチャ ガイド#c1a7c7a9]](アーキ・ガイド) ***補正トランザクション [#d113b16e] -RDBMSのトランザクション・スコープ外で補正を行う。 -[[ロング・トランザクション(バッチ)>#d56122e0]]で必要になる。 --[[リラン可能バッチ的(チェック・ポイントの実装)>https://opentouryo.osscons.jp/index.php?%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86%E6%96%B9%E5%BC%8F#y183f3c4]] --チェック・ポイントで反映されたデータを取り消すなど。 -関連のあるパターンとガイダンス --パターン ---[[Scheduler-Agent-Supervisor>#d9b6b869]] ---[[Retry>#t4755eb8]] ***パイプとフィルター [#d56122e0] -語源は、[[Linuxのパイプとフィルター>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Linux%E3%81%AE%E5%90%84%E7%A8%AE%20%E5%9F%BA%E7%A4%8E#z4c3c029]] -だが、ココでは(、ジョブ・ネット的)、バッチの意味。 -関連のあるパターンとガイダンス --パターン ---[[競合コンシューマー>#adeadf05]] ---[[補正トランザクション>#d113b16e]] ---[[コンピューティング リソース統合>#h0efa234]] ---冪等性 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/pipes-and-filters ***リーダー選定 [#b5489904] -リーダーとして機能するように、単一のタスク インスタンスが選定 -リーダー・インスタンスは、下位タスク インスタンスのアクションを調整 -垂直方向・水平方向のケースがあるが、水平方向の場合は、[[MapReduce>https://dotnetdevelopmentinfrastructure.osscons.jp/index.php?Hadoop#b9ef92ab]]のような。 -関連のあるパターンとガイダンス --[[自動スケール>クラウド アプリケーション アーキテクチャ ガイド#x277761f]](アーキ・ガイド) -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/leader-election ***Scheduler Agent Supervisor [#d9b6b869] -下記要素の協調動作によって処理される。 --Scheduler~ 実行されるタスクを構成する手順を準備し、その操作を調整 --Agent~ リモート リソースへのアクセスをカプセル化して呼び出す。 --Supervisor ---Schedulerによって実行されているタスク内の手順の状態を監視 ---手順の失敗を検出した場合は、復旧または是正アクションの Agent を準備する。 -関連のあるパターンとガイダンス --パターン ---[[補正トランザクション>#d113b16e]] ---[[Retry, Circuit Breaker>#t4755eb8]] ---[[リーダー選定>#b5489904]] ***コレオグラフィ [#z41a1a75] -オーケストレーターに依存せず、システムの各コンポーネントが、~ ビジネス トランザクションのワークフローに関する意思決定プロセスに参加する。 -1 つの方法は、非同期メッセージを使用してビジネス操作をコーディネートする。 -オーケストレーターに起因するパフォーマンスのボトルネックを解消する。 -関連のあるパターンとガイダンス --パターン ---[[アンバサダー>#kd47d078]] ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[パブリッシャー/サブスクライバー>#we34db20]] ---[[補正トランザクション>#d113b16e]] -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/choreography ***コンピューティング リソース統合 [#h0efa234] -複数のタスクを 1 つのコンピューティング単位に統合する。 -コンピューティング単位とは --仮想マシン --Cloud Service ロール --App Service Web アプリ -[[SCM:Service Control Manager>SCM]]的に~ Azure ファブリック コント ローラーがタスクを管理する。~ (そう言う意味では[[前述>#m8158a06]]の「非同期処理サービス」的ではある) -関連のあるパターンとガイダンス --[[自動スケール>クラウド アプリケーション アーキテクチャ ガイド#x277761f]](アーキ・ガイド) -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/compute-resource-consolidation ***破損対策レイヤー [#ee356f31] -新・旧の異なるセマンティクスのシステムを連携する際に~ システム間に挿入するファサード、アダプター レイヤ -関連のあるパターンとガイダンス --[[ストラングラー>#gb7104aa]](パターン) ***ストラングラー [#gb7104aa] -新・旧のバックエンド レガシ システムを段階的に移行する際に~ 要求をインターセプトするように挿入する、ファサード レイヤ -関連のあるパターンとガイダンス --[[破損対策レイヤー>#ee356f31]](パターン) ***アンバサダー [#kd47d078] -アンバサダーは、 --リモート サービスに要求を送る[[エージェント>#d9b6b869]]のようなもの。 --ルーティング、サーキット ブレーキ、ログ記録の機能を提供する。 -関連のあるパターンとガイダンス --[[サイドカー>#kf9fc0f6]](パターン) ***サイドカー [#kf9fc0f6] -別のプロセス(子プロセス、サブ・コンテナ)として実装 -監視、ログ記録、構成、ネットワーク サービスなどの関連する機能を提供 -関連のあるパターンとガイダンス --[[アンバサダー>#kd47d078]](パターン) ***バレット キー [#i4f422e4] -[[(≒OAuth)>OAuth]] -関連のあるパターンとガイダンス --パターン ---[[ゲートキーパー>#r1236eb8]] ---静的コンテンツ ホスティング パターン -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/valet-key ***[[フェデレーション ID>クレームベース認証]] [#x070c362] ***外部構成ストア [#g6bdf9c1] -アプリケーション展開パッケージから、[[構成情報を>.NET config]]を~ 外部ストレージなどの一元管理される場所に移動する。 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/external-configuration-store ***キャッシュ アサイド [#gb491759] オンデマンドでデータをデータ ストアからキャッシュに読込 -パフォーマンスが向上する。 -データ ストアからキャッシュ間で整合性の維持が必要 ***静的コンテンツ ホスティング [#t2f1a55e] -静的コンテンツを、クライアントに直接配信できるクラウド ベースのストレージ サービスにデプロイ -アプリケーションはストレージ サービスの静的コンテンツのURLを配信。 -パフォーマンスと可用性を最大化するために、コンテンツ配信ネットワーク (CDN) を使用。 -サンプル~ https://github.com/mspnp/cloud-design-patterns/tree/master/static-content-hosting *参考 [#c2dfaa70] **[[参照アーキテクチャ]] [#b453c6db] **Microsoft Docs [#b508628e] -クラウド設計パターン - Azure Architecture Center~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/ --Cloud Design Patterns ***カテゴリ [#m86d8985] -可用性のパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/availability -データ管理のパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/data-management -設計と実装のパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/design-implementation -管理と監視のパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/management-monitoring -メッセージングのパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/messaging -パフォーマンスとスケーラビリティのパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/performance-scalability -回復性のパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/resiliency -セキュリティのパターン~ https://docs.microsoft.com/ja-jp/azure/architecture/patterns/category/security ***カタログ [#t00b5522] -WebAPI --[[フロントエンド用バックエンド>#f9d59953]] --[[ゲートキーパー>#r1236eb8]] --[[ゲートウェイ>#o7cb8518]] ---集約 ---オフロード ---ルーティング -可用性 --[[要求チェック>#vbc37c90]] --[[正常性エンドポイント監視>#r913f362]] --サーバ ---[[競合コンシューマー>#adeadf05]] ---[[調整(絞り弁、スロットル)>#r5f048d8]] --クライアント~ ---[[Polly系>#t4755eb8]]~ Retry, Circuit Breaker, Timeout, Bulkhead, Fallback -非同期 --[[非同期要求 - 応答>#i947e3b1]] --キュー ---[[キュー ベースの負荷平準化>#m8158a06]] ---[[優先順位キュー>#tf045f04]] ---[[パブリッシャー/サブスクライバー>#we34db20]] ---[[シーケンシャルなコンボイ>#n889f92a]] -データ --配置 ---[[テーブルのインデックス作成>#q19a433d]] ---[[マテリアライズド・ビュー>#t9eed998]] ---[[シャーディング>#i8ed3766]] --操作 ---[[イベント ソーシング>#gd32eb7b]] ---[[コマンド クエリ責務分離 (CQRS)>#z972b50e]] ---[[補正トランザクション>#d113b16e]] -タスクの協調動作 --[[パイプとフィルター>#d56122e0]] --[[コンピューティング リソース統合>#h0efa234]] --[[リーダー選定>#b5489904]] --[[Scheduler Agent Supervisor>#d9b6b869]] --[[コレオグラフィ>#z41a1a75]] -システム間連系 --[[破損対策レイヤー>#ee356f31]] --[[ストラングラー>#gb7104aa]] -コンポーネント --[[アンバサダー>#kd47d078]] --[[サイドカー>#kf9fc0f6]] -セキュリティ --[[ゲートキーパー>#r1236eb8]] --[[バレット キー>#i4f422e4]] --[[フェデレーション ID>#x070c362]] -その他 --[[外部構成ストア>#g6bdf9c1]] --[[キャッシュ アサイド>#gb491759]] --[[静的コンテンツ ホスティング>#t2f1a55e]] **サンプル(GitHub) [#z590e396] https://github.com/mspnp/cloud-design-patterns -async-request-reply -choreography -claim-check -competing-consumers -compute-resource-consolidation -external-configuration-store -health-endpoint-monitoring -leader-election -pipes-and-filters -priority-queue-sf -priority-queue -static-content-hosting -valet-key ---- Tags: [[:アーキテクチャ]], [[:クラウド系開発]]