すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:スロットリング

最終更新日:Jan 13, 2025

トラフィック バースト、サービスの過負荷、リソースの枯渇、悪意のある攻撃などの問題に対処するために、トラフィックを正確に制御するようにスロットリングを設定できます。 これにより、バックエンド サービスの安定性が保護され、コストが削減され、ユーザー エクスペリエンスが向上します。 このトピックでは、スロットリングの概念、スロットリング モード、およびローカル スロットリングとグローバル スロットリングのしくみについて説明します。

スロットリングの概念

スロットリングは、サービスに送信されるリクエスト数を制限するメカニズムです。 クライアントが一定期間にサービスに送信できるリクエストの最大数を指定します(1 分あたり 300 リクエスト、1 秒あたり 10 リクエストなど)。 スロットリングの目的は、特定のクライアント IP アドレスまたはグローバル クライアントから過剰なリクエストを受信するため、サービスが過負荷になるのを防ぐことです。

たとえば、サービスに送信されるリクエスト数を 1 分あたり 300 に制限すると、301 番目のリクエストは拒否されます。 同時に、過剰なリクエストを示す HTTP 429 ステータス コードが返されます。

スロットリング モード

Envoy プロキシは、ローカル スロットリングとグローバル スロットリングのモードでスロットリングを実装します。 ローカル スロットリングは、各サービス インスタンスのリクエスト レートを制限するために使用されます。 グローバル スロットリングは、グローバル gRPC サービスを使用して、Service Mesh(ASM)インスタンス全体のスロットリングを提供します。 ローカル スロットリングは、グローバル スロットリングと組み合わせて使用​​して、さまざまなレベルのスロットリングを提供できます。

モード

説明

参照

ローカル スロットリング

  • ローカル スロットリングは、Envoy プロセスごとに設定されます。 Envoy プロセスは、Envoy プロキシが挿入されるポッドです。 ローカル スロットリングの設定はグローバル スロットリングの設定よりも簡単で、追加のコンポーネントは必要ありません。 ASM インスタンスにローカル スロットリングとグローバル スロットリングの両方を設定すると、最初にローカル レート制限が適用されます。 ローカル レート制限に達していない場合は、グローバル レート制限が適用されます。 例:

    • ローカル スロットリングでは、特定のクライアントからのリクエスト数が 1 分あたり 50 に制限され、グローバル スロットリング制限は 1 分あたり 60 リクエストであるとします。 クライアントからのリクエスト数が 50 を超えると、リクエスト数がグローバル スロットリング制限に達していなくても、過剰なリクエストは拒否されます。

    • ローカル スロットリングでは、特定のクライアントからのリクエスト数が 1 分あたり 50 に制限され、グローバル スロットリング制限は 1 分あたり 40 リクエストであるとします。 クライアントからのリクエスト数が 40 を超えると、リクエスト数がローカル スロットリング制限に達していなくても、グローバル スロットリングのために過剰なリクエストは拒否されます。

  • ローカル スロットリング制限が設定されているポッドに複数のレプリカがある場合、これらのレプリカにはそれぞれ独自の制限があります。 つまり、リクエストは 1 つのレプリカでは制限される場合がありますが、別のレプリカでは制限されない場合があります。

Traffic Management Center でローカル スロットリングを設定する

グローバルまたは分散スロットリング

  • グローバル スロットリングは、複数のサービスに送信されるリクエスト数を制限します。 このモードでは、クラスター内のすべてのサービスがスロットリング設定を共有します。 通常、グローバル スロットリングには、Redis データベースなどの外部コンポーネントが必要です。

  • グローバル スロットリングは通常、多数のクライアントが少数のサービスにリクエストを送信するシナリオで使用されます。 この場合、リクエストによってサービスが中断される可能性があります。 グローバル スロットリングは、カスケード障害の防止に役立ちます。 たとえば、イングレス ゲートウェイでグローバル スロットリングを設定して、ASM インスタンスに送信されるリクエストの総数を制限できます。 次に、ローカル スロットリングを設定して、ASM インスタンス内の特定のサービスに送信されるリクエスト数を制限できます。

ASMGlobalRateLimiter を使用して、サイドカー プロキシが挿入されたサービスへのインバウンド トラフィックのグローバル スロットリングを設定する

ローカル スロットリングのしくみ

Envoy プロキシは、トークン バケット アルゴリズムを使用してローカル スロットリングを実装します。 トークン バケット アルゴリズムは、バケット内の特定の数のトークンに基づいて、サービスに送信されるリクエスト数を制限する方法です。 トークンは一定のレートでバケットに補充されます。 リクエストがサービスに送信されると、トークンがバケットから削除されます。 バケットが空の場合、リクエストは拒否されます。 通常、次のパラメーターを指定する必要があります。

  • バケットが補充される間隔

  • 各間隔でバケットに追加されるトークン数

デフォルトでは、Envoy プロキシは、リクエストが拒否され、x-envoy-ratelimited ヘッダーが設定されると、HTTP 429 ステータス コードを返します。 HTTP ステータス コードとレスポンス ヘッダーをカスタマイズできます。

スロットリング機能を使用する場合は、次の概念に注意してください。

  • http_filter_enabled:ローカル レート制限がチェックされるが適用されないリクエストの割合を示します。

  • http_filter_enforcing:ローカル レート制限が適用または強制されるリクエストの割合を示します。

値をパーセンテージで設定します。 たとえば、http_filter_enabled をリクエストの 10% に設定し、http_filter_enforcing をリクエストの 5% に設定できます。 この方法では、すべてのリクエストに適用する前に、スロットリングの効果をテストできます。

グローバル スロットリングのしくみ

Envoy のグローバル スロットリングは、ASM インスタンスのリクエスト レートを制御するために使用されるメカニズムです。 Envoy のレート制限サービスに基づいて実装されます。 レート制限サービスは、ASM インスタンス全体のトラフィックを中央で処理し、事前定義されたルールとクォータに基づいてリクエストのレートを制限します。

グローバル スロットリングの設定には、Envoy rate_limits フィルターとレート制限サービスの設定の 2 つの部分が含まれます。

  • rate_limits フィルターには、actions のリストが含まれています。 Envoy プロキシは、rate_limits フィルターの各アクションと各リクエストを照合しようとします。 各アクションに対して記述子が生成されます。 記述子は、アクションに対応する一連の記述子エントリで構成されます。 各記述子エントリは、"descriptor-key-1": "descriptor-value-1""descriptor-key-2": "descriptor-value-2" などのキーと値のペアです。 詳細については、「config-http-filters-rate-limit」をご参照ください。

  • レート制限サービスの設定は、各リクエストに対して生成された記述子エントリと照合されます。 レート制限サービスの設定では、特定の記述子エントリのセットのレート制限を指定します。 レート制限サービスは Redis キャッシュと対話して、リクエストのレートを制限するかどうかを判断し、スロットリングの決定を Envoy プロキシに送信します。

グローバル スロットリングは、rate_limits フィルターとレート制限サービスの設定を組み合わせて実装できます。 rate_limits フィルターは、設定されたアクションに基づいて記述子を生成し、記述子をレート制限サービスに送信します。 レート制限サービスは、記述子の情報に基づいて特定の制限を決定し、スロットリング レスポンスを返します。 このメカニズムにより、リクエストのレートを完全に制御し、バックエンド サービスをリクエスト バーストから保護できます。