スパイク制御

ポリシー名

スパイク制御

概要

API トラフィックを平滑化する。

カテゴリ

最小 Mule バージョン

4.1.0

返される状況コード

Mule Runtime 4.1.0 以降では、API トラフィックを平滑化するスパイク制御ポリシーが提供されています。このポリシーは、一定期間内に処理される要求が、設定された最大数を越えないようにします。

スパイク制御では、スライディングウィンドウアルゴリズムが使用されます。時間の経過とともに、ウィンドウは調整され、ウィンドウ期間内に収まる処理済み情報のみが保持されます。

現在のウィンドウに要求クォータがない場合は、クライアントとの接続を閉じずに、後で再処理するように要求をキューに入れることができます。再処理の遅延と要求数を設定する必要があります。これを行うには、次の例のようにパラメータを設定します。

  • Window size (ウィンドウサイズ): 1 秒

  • # requests per window (ウィンドウあたりの要求数): 2

  • Reprocessing delay (再処理の遅延): 499 ミリ秒

  • # retries (再試行回数): 1

要求の受け入れ、拒否、キューのタイムライン

中括弧が表すアルゴリズムが受け入れた各要求の有効期限は次のとおりです。

  • 最初の 2 つの要求が受け入れられ、使用可能なクォータが 0 になります。要求 1 から 1 秒 (ウィンドウ) 経過後にクォータが 1 に増えます。

  • 要求 3 を受信します。残っているクォータがないため、この要求は 499 ミリ秒間キューに入れられます。

  • 要求 4 を受信します。依然として残っているクォータがないため、この要求は 499 ミリ秒間キューに入れられます。

  • 要求 3 を再試行する少し前に、要求 1 で 1 秒経過したため、ウィンドウの範囲外になり、クォータが解放されます。

  • クォータが 1 になり、要求 3 が正常に再処理されます。要求 2 で 1 秒経過するまでクォータは 0 に戻ります。

  • 要求 4 の遅延が終了したため再処理が必要ですが、要求 2 と 3 で十分な時間が経過していません。遅延時間は残っていないので、要求 4 は拒否されます。

  • 要求 5 を受信します。要求 2 ですでに 1 秒以上経過したので、この要求は受け入れられます。

トラフィックのスパイクを軽減するのが要求の遅延です。その結果、競合の多いシナリオでは、バックエンドが適切に機能し続け (最後の Y ミリ秒に処理される要求数が X を超えない)、API を照会するユーザには、待ち時間は長くなりますが、要求が処理中であることが表示される場合があります。もちろん、正確な設定は API とそのスループットのみに依存します。

ポリシーを適用するには、API Manager で次のパラメータを設定する必要があります。

  • Amount of requests (要求量): 最後の Y ミリ秒に許可される要求数。

  • Time period (期間): ウィンドウサイズ (ミリ秒) (前のパラメータの "Y")。

  • Delay time in milliseconds (遅延時間 (ミリ秒)): 残っているクォータがない場合、再試行するまでに各要求が保持される時間 (ミリ秒)。

  • Delay attempts (遅延試行回数): 要求が再試行される回数。これを超えると拒否されます。

  • Queuing limit (キュー制限): 同時にキューに入れることができる要求数。要求をキューに入れると、スレッドと HTTP 接続を保持する必要があります。キュー制限メカニズムは、攻撃を受けた場合に API がダウンしないようにバルブを開き、API を保護します。

  • Expose headers (ヘッダーを公開): デフォルトで無効。このチェックボックスは、ポリシーがアルゴリズムの動作に関する情報を X-RateLimit ヘッダーで返すことができるようにします。この機能は、API を内部で使用する場合に限り、有効にすることをお勧めします。

前述のとおり、このポリシーの唯一の目的は、クォータの適用ではなく、API およびバックエンドを保護することです。したがって、パラメータはクライアントではなく、バックエンドの容量に依存します。クォータを適用するには、SLA ベースのレート制限ポリシーを使用してください。

また、設定パラメータは、API およびバックエンドを保護するために厳しく制限されています。MuleSoft では、最大パフォーマンスを実現するために、パラメータをできるだけ低い値に設定することをお勧めします。

Was this article helpful?

💙 Thanks for your feedback!