マイクロサービス アーキテクチャは、独立したサービス間で責任を分散します。 この独立により、次の一般的なアーキテクチャの課題に対処する方法が変わります。
- 分散トランザクションを使用しないデータ整合性メンテナンス
- サービス間通信管理
- 故障を連鎖させないための故障分離
- 移行中のレガシ システム統合
この記事の設計パターンでは、これらの課題に直接対処します。 各パターンは、マイクロサービスを設計、構築、運用するときに発生する可能性がある特定の懸念を対象としています。
一般的な設計パターン
破損防止レイヤー は、同じセマンティクスを共有していないサブシステム間にファサードまたはアダプターレイヤーを実装します。 このパターンにより、サブシステム間で要求が変換され、互換性のないドメイン モデルを持つレガシ システムやその他のサービスへの依存関係によって、新しいサービスの設計が制限されるのを防ぐことができます。
フロントエンドのバックエンドでは、 デスクトップやモバイルなど、さまざまな種類のクライアントに対して個別のバックエンド サービスが作成されます。 この方法を使用する場合、1 つのバックエンド サービスで、さまざまなクライアントの種類の競合する要件を処理する必要はありません。 このパターンは、クライアント固有の懸念事項を分離することで、各マイクロサービスをシンプルに保つのに役立ちます。
Bulkhead は、ワークロードまたはサービスごとに、接続プール、メモリ、CPU などの重要なリソースを分離します。 この分離により、1 つのワークロードまたはサービスですべてのリソースが消費されなくなります。 このパターンでは、1 つのサービスが連鎖的な障害を引き起こすのを防ぐことで、ワークロードの回復性が向上します。
コレオグラフィ を使用すると、各サービスは、中央オーケストレーターに応じてではなく、ビジネス操作をいつどのように処理するかを決定できます。 このパターンにより、サービス間の結合が減り、頻繁にサービスの更新や変更がサポートされます。
コマンド クエリ責任分離 (CQRS) は、 読み取り操作を書き込み操作から個別のデータ モデルに分離します。 このパターンにより、読み取りと書き込みのパフォーマンスやスケーリングの要件が異なるマイクロサービスのパフォーマンス、スケーラビリティ、およびセキュリティが向上します。
ゲートウェイ ルーティング では、API ゲートウェイをリバース プロキシとして使用し、要求に基づいてクライアント要求を異なるサービスにルーティングします。 この方法では、クライアントに多くのエンドポイントではなく単一のエンドポイントが提供されます。
ゲートウェイ集約 では、ゲートウェイを使用して複数のクライアント要求を 1 つの要求に結合します。 このアプローチにより、クライアントとサービスの間のチャット性が低下します。
ゲートウェイ オフロード では、Secure Socket Layer (SSL) の終了、認証、レート制限などのクロスカット機能がゲートウェイに一元化されるため、個々のサービスでこれらの問題を個別に実装する必要はありません。
詳細については、「 マイクロサービスの API ゲートウェイ」を参照してください。
Saga は 、独立したデータ ストアを持つマイクロサービス間のデータ整合性を管理します。 saga は、各サービスがその操作を実行し、次のステップをトリガーする一連のローカル トランザクションです。 ステップが失敗した場合、saga は補正トランザクションを実行して、上記の変更を元に戻します。 このパターンは、マイクロサービス アーキテクチャでは実用的ではない分散トランザクションを置き換えます。
サイドカー は、分離とカプセル化を提供するために、アプリケーションのヘルパー コンポーネントを別のコンテナーまたはプロセスとしてデプロイします。 このパターンを使用して、ログ記録、監視、ネットワーク構成などの一般的な機能を、サービスのコードに埋め込まずにサービスにアタッチします。
Strangler Fig は、特定の機能を新しいサービスに徐々に置き換えることで、レガシ システムからの増分移行をサポートしています。 レガシ システムを完全に置き換えるまで、コンシューマーは同じインターフェイスを引き続き使用します。移行が行われているかどうかは認識されません。
サポート パターン
サービス間通信 では、回復性のあるサービス間呼び出しの 再試行 パターンと サーキット ブレーカー パターンについて説明します。
Azure アーキテクチャ センターのクラウド 設計パターンの完全なカタログについては、「 クラウド設計パターン」を参照してください。