Service Mesh (ASM) は、クラスタ内のすべての南北トラフィックと東西トラフィックの統合管理をサポートしています。トラフィックのタイムアウト、リトライ、レート制限、サーキットブレーキング、キューイング、プリフェッチ、フォールバックを設定することにより、Service Mesh は分散システムの高可用性を多角的に強化します。このトピックでは、主に Service Mesh のさまざまな高可用性機能の概念とシナリオについて紹介します。
機能紹介
分散システムでは、システムの安定性と高可用性を確保するために、トラフィックの保護とスケジューリングが不可欠です。これらのシステムの複雑さのため、トラフィックの変動や異常は、サービス障害、雪崩効果、またはリソースの枯渇につながる可能性があります。
Resilience4j などの従来のサービス開発フレームワークは、レート制限やサーキットブレーキングなどの高可用性機能を提供します。ただし、Service Mesh はこれらの機能をネットワークインフラストラクチャレベルで提供し、シームレスに統合することで、高可用性機能の結合を減らし、構成の柔軟性を高めます。
以下は、各高可用性機能の詳細な説明です。
トラフィック レート制限: 過負荷からのシステム保護
レート制限は、分散システムでサービスの安定性を維持するための基本的な戦略です。バックエンド サービスを高トラフィックの影響、サービスの過負荷、リソースの枯渇、または悪意のある攻撃から保護するためのトラフィックを正確に制御することで、コストを削減し、ユーザー エクスペリエンスを向上させます。マルチテナンシー シナリオでは、レート制限を各テナントに個別に適用して、きめ細かいトラフィック管理と公平な使用を実現できます。
ASM は、さまざまなレート制限戦略を通じて、分散システムに包括的な保護機能を提供します。
ローカル レート制限とグローバル レート制限
メッシュ プロキシ Envoy は、2 種類のレート制限保護メソッド(ローカル レート制限とグローバル レート制限)をサポートしています。
シナリオ
ローカル レート制限とグローバル レート制限は、最も一般的なシナリオ(クラスタ内の特定のサービスまたはゲートウェイの特定のルートのレート制限)をサポートし、特定のリクエスト マッチに基づいて個別のレート制限クォータを設定できます。
-
グローバル レート制限: 集中型レート制限サービスと Redis データベースを使用して複数のサービスに実装されます。
-
ローカル レート制限: 外部コンポーネントに依存しない、よりシンプルな構成ですが、各レプリカには独自の独立したレート リミッターがあります。
ASM トラフィック スケジューリング スイートに基づくレート制限
ASM トラフィック スケジューリング スイートは、Service Mesh に基づく統合トラフィック スケジューリング アーキテクチャ パターンです。クラウドネイティブ分散アプリケーションでのリクエストの統合ロード スケジューリングと管理を目的としたさまざまなトラフィック スケジューリング ポリシーが含まれています。スイートは、RateLimitingPolicy を使用したレート制限をサポートしています。
シナリオ
RateLimitingPolicy は、タグによるリクエストのグループ化や各グループ内でのレート制限の適用などの高度な機能をサポートしており、マルチテナンシー環境でのきめ細かい制御シナリオに適しています。
トラフィックの同時実行制御: システムの重要なリソースの保護
同時実行制御は、もう 1 つの重要な高可用性機能です。同時リクエスト数を管理して、システム リソースの枯渇を防ぎます。トラフィック レート制限とは異なり、同時実行制御は、スレッド プールやデータベースなどの重要なシステム リソースに依存するサービスに最適であり、これらのリソースを保護し、リソース使用効率を向上させます。
ASM は、主に 2 つの同時実行制御メカニズムを提供します。
ASM トラフィック スケジューリング スイートに基づく同時実行制御
ASM トラフィック スケジューリング スイートは、ConcurrencyLimitingPolicy を使用した同時リクエスト数の制御をサポートしています。
シナリオ
システムの同時実行容量が比較的固定されている場合は、特定のサービスに固定の同時実行制限を設定できます。制限を超えるリクエストは、429 応答を受け取ります。
ASMAdaptiveConcurrency を使用した適応型同時実行制御
Envoy は適応型同時実行制御メソッドをサポートしており、ASMAdaptiveConcurrency を介して有効にすることができます。ASMAdaptiveConcurrency はアルゴリズムを使用して、同時実行制限をサービスの許容範囲に近づけ、この制限を超えるリクエストをエラー メッセージ「reached concurrency limit」とともに 503 応答で拒否します。
シナリオ
システムの容量が大きく変化し、推定が難しい場合は、ASM の AdaptiveConcurrency を使用して同時実行を制限できます。AdaptiveConcurrency を有効にした後、DestinationRule を介してサービスのリトライ機能を有効にして、拒否されたリクエストが正常に再試行されるようにすることもお勧めします。
トラフィック サーキットブレーキング: 雪崩効果を防ぐための障害ノードの分離
サーキットブレーキングは分散システムに不可欠であり、異常が発生した場合にサービスからすぐに切断できるため、障害のあるサービスを分離し、障害の拡散を防ぎます。
ASM は、さまざまなディメンションとレベルでサーキットブレーキング機能を提供します。
接続プール レベルのサーキットブレーキング
接続プール サーキットブレーキングは宛先ルールでサポートされており、ターゲット サービス ホストへの HTTP/1 または TCP 接続の最大数を制限します。
シナリオ
この戦略は、TCP 接続数を制限することでサーキットブレーキングを実現し、HTTP ステータス コードで問題を示すことができないサービスに使用されます。
ホスト レベルのサーキットブレーキング
ホスト レベルのサーキットブレーキングも宛先ルールでサポートされています。タイム ウィンドウ内のエラーを監視し、エラー率がしきい値を超えた場合にリクエストを切断します。
シナリオ
ホスト レベルのサーキットブレーキングは、各アップストリーム ホストに対して独立して機能し、5xx ステータス コードが連続して発生するホストをロード バランシング プールから一時的に削除します。単一のワークロードの問題による連続エラーの検出には適していますが、特定の API インターフェースには適していません。
ルート レベルのサーキットブレーキング
ASM は、サービス間および特定のルートの東西トラフィックのサーキット ブレーカー ルールの設定をサポートしています。詳細については、「参照ドキュメント」をご参照ください。
シナリオ
ルート レベルのサーキットブレーキングはサービス レベルで機能し、サービスの依存関係または論理エラーが原因で特定のサービス API で連続して発生するエラーを検出します。
トラフィック フォールバック: 呼び出し失敗シナリオの処理
サービスに障害が発生したり、使用できなくなった場合、フォールバック メカニズムはバックアップ サービスを呼び出してリクエストを処理し、システムの安定性と可用性を確保します。
シナリオ
ホスト レベルのサーキットブレーキングとトラフィック フォールバックを一緒に使用すると、停止中にバックアップ サービスに切り替えることができ、サーキットブレーキング中のシステムの可用性を維持できます。
トラフィック プリフェッチ: 新バージョン デプロイメントの円滑な移行
従来のブルーグリーン デプロイメントまたはローリング アップデートでは、新しいサービス バージョンがすべてのトラフィックをすぐに引き継ぐと、過剰な負荷が発生する可能性があります。サービス プリフェッチは、リクエストの 10% から開始して徐々に増加するなど、段階的にトラフィックを導入するため、コールド スタート コストの高いサービスに適しています。
ASM は、2 つのレベルのトラフィック プリフェッチ機能をサポートしています。
スロースタート プリフェッチ
スロースタート モードは宛先ルールでサポートされており、サービス インスタンスが設定されたタイム ウィンドウ内でリクエスト量を徐々に増やすことができます。
シナリオ
リクエスタがターゲット サービスにリクエストを送信し、ターゲット サービスのアップストリーム ホスト エンドポイントがスロースタート ウィンドウ内にある場合、ロードバランサは、そのアップストリーム ホストに割り当てられるトラフィックを適切に削減します。この機能は、サービスのスケールアウトや新しいバージョンのリリースなどのシナリオに最適です。サービスの新たに起動されたアップストリーム ホストのプリフェッチが可能になるためです。
リクエスタがターゲット サービスにリクエストを送信し、ターゲット サービスのアップストリーム ホスト エンドポイントがスロースタート ウィンドウ内にある場合、ロード バランサーはそのアップストリーム ホストに割り当てられるトラフィックを適切に削減します。この機能は、サービスのスケールアウトや新バージョンのリリースなどのシナリオに最適です。サービスの新たに起動されたアップストリーム ホストのプリフェッチが可能になるためです。新しいオンライン サービスまたはオプションのアップストリーム ホスト エンドポイントが制限されている場合、スロースタート プリフェッチ機能は適用されません。
ASM トラフィック スケジューリング スイートに基づく段階的なサービス オンライン化
新しいサービスをリリースするときにLoadRampingPolicy の構成を同期することで、受信トラフィックを徐々に増やし、スムーズな移行を保証できます。
シナリオ
ASM トラフィック スケジューリング スイートは、リクエスト サンプラーを使用してリクエストの一部を拒否し、サービスが受信する総トラフィックがゆっくりと増加するようにします。このメソッドは新しいサービスのリリースに適していますが、サービスのスケールアウトや新バージョンのリリースには適していません。
トラフィック タイムアウトとリトライ: サービス呼び出しの信頼性の向上
タイムアウトとリトライは、分散システムにおける一般的なフォールト トレランス対策であり、サービスでエラーが断続的に発生した場合でも一定レベルの可用性を確保します。タイムアウトはリクエストの長期的な中断を防ぎ、リトライはネットワーク ジッターまたは一時的な障害を補います。
リクエスト キューイングと優先順位スケジューリング: トラフィック ピークのスムーズな処理
リクエスト キューイングは、レート制限と同時実行制御を管理するメカニズムです。リクエストのレートまたは同時実行レベルがシステムの容量を超えた場合、後続のリクエストはすぐに拒否されません。代わりに、キューに入れられ、以前のリクエストが処理された後に処理されるのを待ちます。
ASM は、トラフィック スケジューリング スイート内で同時実行、トラフィック レート、およびレイテンシ適応に焦点を当てた 3 つの優先順位スケジューリング戦略を提供します。また、リクエストの優先順位キューイングを有効にすることで、優先順位の高いリクエストが最初に処理されるようにし、重要なシステム機能の安定性を維持したり、主要なテナントのユーザー エクスペリエンスを向上させたりします。
リクエスト キューイングと優先順位スケジューリングでサポートされている戦略は次のとおりです。
制御可能な同時実行下でのリクエスト優先順位スケジューリング
ConcurrencySchedulingPolicy を設定することにより、指定された同時実行制限を使用してトラフィックの過負荷状態が評価されます。リクエストの同時実行がこの制限を超えると、追加のリクエストはキューに入れられ、優先順位に従ってスケジュールされます。
シナリオ
このアプローチは、同時実行制限があり、トラフィックの変動が大きいアプリケーションやサービスに最適です。同時実行制限を使用してトラフィックが過負荷になっているかどうかを判断するためです。
制御可能なレート下でのリクエスト優先順位スケジューリング
QuotaSchedulingPolicy を設定することにより、指定されたレート制限を使用してトラフィックが過負荷になっているかどうかが評価されます。リクエストの同時実行がこの制限を超えると、追加のリクエストはキューに入れられ、優先順位に従ってスケジュールされます。
シナリオ
この戦略は、トラフィック レート制限を適用することでトラフィックの過負荷を評価するために使用され、リクエスト フロー レート制限があり、トラフィック量の変動が大きいアプリケーションに最適です。
レイテンシ適応に基づくリクエスト優先順位スケジューリング
AverageLatencySchedulingPolicy を設定することにより、システムはリクエストのリアルタイム レイテンシを過去の平均と比較して、トラフィックの過負荷を特定します。現在のリクエスト レイテンシが過去の平均から大きく逸脱している場合、システムは過負荷と見なされ、後続のリクエストのキューイングと優先順位に基づくスケジューリングが行われます。
シナリオ
この適応型メソッドは、サービスの最大許容レートまたは同時実行を確認するのが難しい場合に、リクエストのキューイングと優先順位付けに適しています。