トラフィック バースト、サービスの過負荷、リソースの枯渇、悪意のある攻撃などの問題に対処するために、トラフィックを正確に制御するようにスロットリングを設定できます。 これにより、バックエンド サービスの安定性が保護され、コストが削減され、ユーザー エクスペリエンスが向上します。 このトピックでは、スロットリングの概念、スロットリング モード、およびローカル スロットリングとグローバル スロットリングのしくみについて説明します。
スロットリングの概念
スロットリングは、サービスに送信されるリクエスト数を制限するメカニズムです。 クライアントが一定期間にサービスに送信できるリクエストの最大数を指定します(1 分あたり 300 リクエスト、1 秒あたり 10 リクエストなど)。 スロットリングの目的は、特定のクライアント IP アドレスまたはグローバル クライアントから過剰なリクエストを受信するため、サービスが過負荷になるのを防ぐことです。
たとえば、サービスに送信されるリクエスト数を 1 分あたり 300 に制限すると、301 番目のリクエストは拒否されます。 同時に、過剰なリクエストを示す HTTP 429 ステータス コードが返されます。
スロットリング モード
Envoy プロキシは、ローカル スロットリングとグローバル スロットリングのモードでスロットリングを実装します。 ローカル スロットリングは、各サービス インスタンスのリクエスト レートを制限するために使用されます。 グローバル スロットリングは、グローバル gRPC サービスを使用して、Service Mesh(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 フィルターは、設定されたアクションに基づいて記述子を生成し、記述子をレート制限サービスに送信します。 レート制限サービスは、記述子の情報に基づいて特定の制限を決定し、スロットリング レスポンスを返します。 このメカニズムにより、リクエストのレートを完全に制御し、バックエンド サービスをリクエスト バーストから保護できます。