ヒント
このコンテンツは、.NET Docs で入手できる、またはオフラインで読み取ることができる無料のダウンロード可能な PDF として入手できる、コンテナー化された .NET アプリケーションの電子ブックである .NET マイクロサービス アーキテクチャからの抜粋です。
マイクロサービス ベースのアプリケーションなどの分散システムでは、部分的な障害のリスクが常に存在します。 たとえば、1 つのマイクロサービス/コンテナーが失敗したり、短時間応答できない場合や、1 つの VM またはサーバーがクラッシュする可能性があります。 クライアントとサービスは個別のプロセスであるため、サービスはクライアントの要求にタイムリーに応答できない場合があります。 サービスが過負荷になり、要求に対する応答が非常に遅くなったり、ネットワークの問題のために短時間アクセスできない場合があります。
たとえば、eShopOnContainers サンプル アプリケーションの [注文の詳細] ページについて考えてみます。 ユーザーが注文を送信しようとしたときに注文マイクロサービスが応答しない場合、クライアント プロセス (MVC Web アプリケーション) の不適切な実装 (たとえば、クライアント コードがタイムアウトなしで同期 RPC を使用する場合) は、応答を待機しているスレッドを無期限にブロックします。 不適切なユーザー エクスペリエンスを引き起こすだけでなく、応答のない待機はすべてスレッドを消費またはブロックし、スレッドは高いスケーラビリティを持つアプリケーションで非常に重要です。 ブロックされたスレッドが多数存在する場合は、最終的にアプリケーションのランタイムがスレッドを使い果たしてしまう可能性があります。 その場合、図 8-1 に示すように、アプリケーションは部分的に応答せず、グローバルに応答しなくなる可能性があります。
図 8-1. サービス スレッドの可用性に影響する依存関係が原因で発生した部分的なエラー
大規模なマイクロサービス ベースのアプリケーションでは、部分的な障害が増幅される可能性があります。特に、内部マイクロサービスの相互作用の大部分が同期 HTTP 呼び出し (アンチパターンと見なされる) に基づいている場合です。 1 日に何百万もの着信通話を受信するシステムについて考えてみましょう。 同期 HTTP 呼び出しの長いチェーンに基づく不適切な設計がシステムにある場合、これらの着信呼び出しにより、同期依存関係として数十個の内部マイクロサービスに対して何百万もの発信呼び出し (1:4 の比率を考えてみましょう) が発生する可能性があります。 この状況を図 8-2 に示します。特に依存関係 #3 はチェーンを開始し、依存関係 #4 を呼び出し、その後 #5 を呼び出します。
図 8-2. HTTP 要求の長いチェーンを特徴とする不適切な設計の影響
すべての依存関係自体に優れた可用性がある場合でも、分散型およびクラウドベースのシステムでは断続的な障害が保証されます。 これは、考慮する必要がある事実です。
フォールト トレランスを確保するための手法を設計および実装していない場合は、たとえ短時間のダウンタイムであっても増幅する可能性があります。 たとえば、可用性が 99.99% の依存関係がそれぞれ 50 個あると、この波及効果により、毎月数時間のダウンタイムが発生します。 大量の要求の処理中にマイクロサービスの依存関係が失敗した場合、そのエラーにより、各サービスで使用可能なすべての要求スレッドがすぐに飽和し、アプリケーション全体がクラッシュする可能性があります。
図 8-3 同期 HTTP 呼び出しの長いチェーンを持つマイクロサービスによって増幅された部分的な障害
この問題を最小限に抑えるために、「 非同期マイクロサービス統合によるマイクロサービスの自律性の強制」セクションでは、内部マイクロサービス間で非同期通信を使用することをお勧めします。
さらに、部分的な障害を処理するようにマイクロサービスとクライアント アプリケーションを設計することが不可欠です。つまり、回復性の高いマイクロサービスとクライアント アプリケーションを構築します。
.NET