クラウド設計パターン
これらの設計パターンは、信頼性の高い、スケーラブルで安全なアプリケーションをクラウドに構築するために役立ちます。
パターンごとに、そのパターンで対処する問題、パターンの適用に関する考慮事項、Microsoft Azure に基づいた例を説明します。 ほとんどのパターンには、Azure でのパターンの実装方法を示すコード サンプルまたはスニペットが含まれています。 ただし、パターンのほとんどは、ホストが Azure か他のクラウド プラットフォームかにかかわらず、分散システムに関連しています。
クラウド ワークロードでは、分散コンピューティングに関する誤解が生じやすくなります。 クラウド設計に関する誤解の例を次に示します。
- ネットワークは信頼できる
- 待機時間はゼロである
- 帯域幅は無限に存在する
- ネットワークはセキュリティで保護されている
- トポロジが変更されることはない
- 管理者は 1 人しかいない
- コンポーネントのバージョン管理は容易である
- 監視の実装は遅れてもよい
設計パターンを使用しても、このような誤解は払拭できませんが、誤った認識の緩和および補正を促し、適切な認識をもたらすために役立つ場合があります。 各クラウド パターンには、それぞれのトレードオフが存在します。 特定のパターンを実装する方法よりも、なぜそのパターンを選択するのかという点に注意を払う必要があります。
クラウド開発での課題
データ管理データ管理はクラウド アプリケーションの重要な要素であり、品質属性のほとんどに影響します。 通常、パフォーマンス、スケーラビリティ、または可用性のために、データは複数のサーバーにまたがってさまざまな場所でホストされます。 これにより、さまざまな課題が発生する可能性があります。 たとえば、データの整合性を維持する必要があります。また、通常はさまざまな場所にあるデータを同期する必要があります。 |
|
設計と実装優れた設計では、コンポーネントの設計とデプロイの一貫性や統一性、管理と開発を簡素化する保守容易性、コンポーネントやサブシステムを他のアプリケーションやシナリオで利用できる再利用性が備わっています。 設計および実装フェーズで行われる意思決定は、クラウドでホストされているアプリケーションやサービスの品質と総保有コストに大きな影響を及ぼします。 |
|
メッセージングクラウド アプリケーションの分散特性には、スケーラビリティを最大化するために、コンポーネントとサービスが (理想的には疎結合で) 接続されているメッセージング インフラストラクチャが必要です。 非同期メッセージングは広く使用されており、多数の利点がありますが、メッセージの順序付け、有害メッセージ管理、べき等性などの課題もあります。 |
パターンのカタログ
Pattern | まとめ | カテゴリ |
---|---|---|
Ambassador | コンシューマー サービスまたはアプリケーションの代わりにネットワーク要求を送信するヘルパー サービスを作成します。 | 設計と実装 オペレーショナル エクセレンス |
破損対策レイヤー | 最新アプリケーションとレガシ システムの間にファサード、すなわちアダプター レイヤーを実装します。 | 設計と実装 オペレーショナル エクセレンス |
非同期要求-応答 | フロントエンド ホストからバックエンド処理を分離します。その場合バックエンド処理を非同期にする必要がありますが、引き続きフロントエンドには明確な応答が必要です。 | メッセージング |
フロントエンド用バックエンド | 特定のフロント エンド アプリケーションやインターフェイスによって使用される個別のバックエンド サービスを作成します。 | 設計と実装 |
Bulkhead | アプリケーションの要素をプールに分離し、1 つの要素が失敗しても、他の要素が引き続き機能できるようにします。 | 信頼性 |
キャッシュ アサイド | オンデマンドでデータをデータ ストアからキャッシュに読み込みます。 | データ管理 パフォーマンス効率 |
コレオグラフィ | 中央のオーケストレーターに依存するのではなく、業務をいつどのように処理するかを各サービスで決定できます。 | メッセージング、 パフォーマンス効率 |
Circuit Breaker | リモート サービスまたはリソースとの接続時の修正に要する時間が一定しないエラーを処理します。 | 信頼性 |
要求チェック | 大きいメッセージを要求チェックとペイロードに分割して、メッセージ バスに過度な負荷がかかることを防ぎます。 | メッセージング |
補正トランザクション | 最終的に整合性がある操作を定義する一連のステップで実行された作業を元に戻します。 | 信頼性 |
競合コンシューマー | 複数の同時実行コンシューマーが、同じメッセージング チャネルで受信したメッセージを処理できるようにします。 | メッセージング |
コンピューティング リソース統合 | 複数のタスクまたは操作を 1 つのコンピューティング単位に統合します。 | 設計と実装 |
CQRS | 個別のインターフェイスを使用して、データを更新する操作とデータを読み取る操作を分離します。 | データ管理 設計と実装 パフォーマンス効率 |
デプロイ スタンプ | データ ストアなど、アプリケーション コンポーネントの複数の独立したコピーをデプロイします。 | 信頼性、 パフォーマンス効率 |
エッジ ワークロードの構成 | 現場の多種多様なシステムやデバイスにより、ワークロードの構成が困難な問題になる場合があります。 | 設計と実装 |
イベント ソーシング | 追加専用のストアを使用して、ドメイン内のデータに実行されるアクションを記述する一連のすべてのイベントを記録します。 | データ管理 パフォーマンス効率 |
外部構成ストア | アプリケーション展開パッケージから、一元管理される場所に構成情報を移動します。 | 設計と実装 オペレーショナル エクセレンス |
フェデレーション ID | 外部の ID プロバイダーに認証を委任します。 | Security |
ゲートキーパー | 専用のホスト インスタンスを使用して、アプリケーションとサービスを保護します。このホスト インスタンスは、クライアントとアプリケーションまたはサービスの間でブローカーとして機能し、要求を検証して不要部分を削除し、クライアントとアプリケーションまたはサービスの間で要求とデータを渡します。 | Security |
ゲートウェイ集約 | ゲートウェイを使用して、複数の個々の要求を 1 つの要求に集約します。 | 設計と実装 オペレーショナル エクセレンス |
ゲートウェイ オフロード | 共有または専用のサービス機能の負荷をゲートウェイ プロキシにオフロードします。 | 設計と実装 オペレーショナル エクセレンス |
ゲートウェイ ルーティング | 単一のエンドポイントを使用して複数のサービスに要求をルーティングします。 | 設計と実装 オペレーショナル エクセレンス |
Geode | バックエンド サービスを一連の地理的ノードにデプロイします。各ノードが、任意のリージョンで任意のクライアント要求を処理できます。 | 信頼性、 オペレーショナル エクセレンス |
正常性エンドポイント監視 | 公開されたエンドポイントを通じて外部ツールが定期的にアクセスできる機能チェックをアプリケーションに実装します。 | 信頼性、 オペレーショナル エクセレンス |
テーブルのインデックス作成 | クエリによって頻繁に参照されるデータ ストア内のフィールドにインデックスを作成します。 | データ管理 パフォーマンス効率 |
リーダー選定 | 1 つのインスタンスを、他のインスタンスの管理を担当するリーダーとして選定することで、分散アプリケーション内で連携するタスク インスタンスのコレクションによって実行されるアクションを調整します。 | 設計と実装 信頼性 |
具体化されたビュー | データの形式が必要なクエリ操作に適していない場合に、1 つ以上のデータ ストアのデータの事前設定されたビューを生成します。 | データ管理 オペレーショナル エクセレンス、 パフォーマンス効率 |
パイプとフィルター | 複雑な処理を実行するタスクを、再利用できる一連の独立した要素に分解します。 | 設計と実装 メッセージング |
優先順位キュー | サービスに送信される要求に優先順位を設定し、優先順位の高い要求から順番に受信および処理されるようにします。 | メッセージング、 パフォーマンス効率 |
パブリッシャー/サブスクライバー | 送信側と受信側を結合せずに、アプリケーションから関心を持っている複数のコンシューマーに対して非同期的にイベントを通知できるようにします。 | メッセージング |
キュー ベースの負荷平準化 | タスクとそのタスクが呼び出すサービスとの間でバッファーとして機能するキューを使用して、断続的な大きい負荷を平準化します。 | 信頼性、 メッセージング、 回復性 パフォーマンス効率 |
レート制限パターン | これら調整制限に関連する調整エラーを回避または最小化し、スループットをより正確に予測するのに役立つ制限パターン。 | 信頼性 |
Retry | 予測される一時的な障害をアプリケーションが処理できるようにします。アプリケーションがサービスまたはネットワーク リソースに接続しようとする際に、失敗した操作を透過的に再試行します。 | 信頼性 |
Saga | 分散トランザクションのシナリオで、マイクロサービス間のデータ整合性を管理します。 saga はトランザクションのシーケンスです。この saga によって各サービスが更新され、次のトランザクション ステップをトリガーするメッセージまたはイベントが発行されます。 | メッセージング |
Scheduler エージェント スーパーバイザー | 分散された一連のサービスやその他のリモート リソースにわたる一連のアクションを調整します。 | メッセージング、 信頼性 |
シーケンシャルなコンボイ | 他のメッセージ グループの処理をブロックせずに、関連する一連のメッセージを定義された順序で処理します。 | メッセージング |
シャーディング | データ ストアを水平方向のパーティションまたはシャードのセットに分割します。 | データ管理 パフォーマンス効率 |
Sidecar | アプリケーションのコンポーネントを別のプロセスまたはコンテナーにデプロイして、分離性とカプセル化を実現します。 | 設計と実装 オペレーショナル エクセレンス |
静的コンテンツ ホスティング | 静的コンテンツを、クライアントに直接配信できるクラウド ベースのストレージ サービスにデプロイします。 | 設計と実装 データ管理 パフォーマンス効率 |
ストラングラー フィグ | 機能の特定の部分を新しいアプリケーションやサービスに徐々に置き換えることで、レガシ システムを段階的に移行します。 | 設計と実装 オペレーショナル エクセレンス |
調整 | アプリケーションのインスタンス、個々のテナント、またはサービス全体によって使用されるリソースの使用量を制御します。 | 信頼性、 パフォーマンス効率 |
バレット キー | 特定のリソースまたはサービスへの限定的な直接アクセスをクライアントに提供する、トークンまたはキーを使用します。 | データ管理 Security |