スパイク制御ポリシー

ポリシー名

スパイク制御

概要

API トラフィックを規制する

カテゴリ

サービス品質

使用可能な最小 Flex Gateway バージョン

v1.0.0

返される状況コード

429 - HTTP API による要求の数が設定された制限を超えました。指定された再試行回数を超えると要求は拒否されます。

概要

スパイク制御ポリシーは、API で処理されるメッセージ数を制限して、API 要求トラフィックを規制します。このポリシーにより、指定された時間内に処理されるメッセージ数が、設定した制限を超えなくなります。この数を超えると、要求はキューに入り、設定したポリシーに基づいて再試行されます。

ポリシーのパラメーターの設定

スパイク制御ポリシーでは、クォータの適用は実行されません。設定パラメーターは、API およびバックエンドを保護するために制限されています。そのため、パフォーマンスを最大化するには、これらのパラメーターに設定する値をできる限り小さくします。

Flex Gateway のローカルモード

ローカルモードでは、宣言型の設定ファイルを使用してスパイク制御ポリシーを API に適用します。以下のポリシー定義とパラメーターの表を参照してください。

- policyRef:
    name: spike-control-flex
  config:
    maximumRequests: <int> // REQUIRED, default: 1
    timePeriodInMilliseconds: <int> // REQUIRED, default: 1000
    delayTimeInMillis: <int> // REQUIRED, default: 1000
    delayAttempts: <int> // REQUIRED, default: 1
    queuingLimit: <int> // OPTIONAL, default: 0
    exposeHeaders: <bool> // OPTIONAL, default: false
パラメーター 必須または省略可能 デフォルト値 説明

maximumRequests

必須

1

時間枠内で許可される要求数

timePeriodInMilliseconds

必須

1000

時間枠のサイズ

delayTimeInMillis

必須

1000

クォータが残っていない場合の再試行までの各要求の保持時間

delayAttempts

必須

1

要求が再試行される回数。これを超えると拒否されます。

queuingLimit

省略可能

0

特定の期間にキューに入れることができる要求数

exposeHeaders

省略可能

false

内部 API のみに対して有効にします。ポリシーがアルゴリズムの動作に関する情報を X-RateLimit ヘッダーで返すことができるようにします。

リソースの設定例

- policyRef:
    name: spike-control-flex
  config:
    queuingLimit: 0
    exposeHeaders: true
    delayTimeInMillis: 1000
    timePeriodInMilliseconds: 1000
    delayAttempts: 1
    maximumRequests: 100000

Flex Gateway の接続モード

UI からポリシーを API に適用するときに、以下のパラメーターが表示されます。

要素 説明 必須

Number of Reqs (要求の数)

指定されたウィンドウで許可されている要求数/ミリ秒

はい

Time Period (期間)

要求の処理する期限 (ミリ秒)

はい

Delay Time in Milliseconds (遅延時間 (ミリ秒))

クォータが残っていない場合の再試行までの各要求の保持時間 (ミリ秒)

はい

Delay Attempts (遅延試行回数)

要求が再試行される回数。これを超えると拒否されます。

はい

Queuing Limit (キュー制限)

特定の期間にキューに入れることができる要求数

いいえ

Expose Headers (ヘッダーを公開)

内部 API の場合にのみ有効にします。ポリシーがアルゴリズムの動作に関する情報を X-RateLimit ヘッダーで返すことができるようにします。

いいえ

Method & Resource conditions (メソッドとリソースの条件)

API の一部またはすべてのメソッドおよびリソースに設定を追加するオプション

はい

要求クォータを適用する方法は、​レート制限: SLA ベースのポリシー and レート制限ポリシー​ を参照してください。

ポリシーのしくみ

スパイク制御ポリシーは、​スライディングウィンドウアルゴリズム​を使用して、トラフィックの急増を緩和し、ゲートウェイインスタンスを保護します。ウィンドウの表示サイズは、結果の推移に合わせて自己調整されます。

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

  • Time Period​: 1 秒

  • Number of Reqs​: 2

  • Delay Time in Milliseconds​: 499 ミリ秒

  • Delay Attempts​: 1

  • Queuing Limit​: 5

要求をキューに入れると、スレッドと HTTP 接続を保持する必要があります。ポリシーで ​Queuing Limit​ パラメーターを指定すると、リソースが不足しないようにゲートウェイが保護され、攻撃を受けた場合でも API が失敗しなくなります。

要求のタイムライン

次の図は、前のセクションで定義された設定を使用して、アルゴリズムによって受け入れられた各要求の有効期限を示しています。

要求の受け入れ、拒否、キューのタイムライン
  1. 最初の 2 つの要求が受け入れられ、使用可能なクォータが 0 になります。

    要求 1 から 1 秒 (​window size​ 値) 経過後にクォータが 1 に増えます。

  2. 要求 3 を受信します。

    使用可能なクォータがないため、この要求は 499 ミリ秒間キューに入れられます。

  3. 要求 4 を受信します。

    まだ使用可能なクォータがないたえ、この要求は 499 ミリ秒間キューに入れられます。

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

  5. クォータが 1 になり、要求 3 が正常に再処理されます。

    要求 2 で 1 秒経過するまでクォータは 0 に戻ります。

  6. 要求 4 の遅延が終了したため再処理が必要です。

    要求 4 が拒否されます。使用できるクォータが残っていないため、要求 2 と 3 で 1 秒が経過していません。要求 4 はそれ以上遅延しません。

  7. 要求 5 を受信します。

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

この例は、要求の遅延と、キューに入れてトラフィックの急増を規制する方法を示しています。競合の多いシナリオでは、バックエンドが適切に機能し続けます (最後の Y ミリ秒に処理される要求数が X を超えない)。

API を照会するユーザーには、レイテンシーは長くなりますが、要求が処理中であることが表示される場合があります。ポリシーの正確な設定は API とそのスループットのみに依存します。

FAQ

このスライディングウィンドウはいつ開始されますか?

このウィンドウは、ポリシーが正常に適用された後の最初の要求で開始されます。

アルゴリズムが使用するウィンドウの種別は?

アルゴリズムは、スライディングウィンドウを使用して、ポリシーで設定されている期間でトランザクションを監視します。

クォータを使い果たすとどうなりますか?

要求クォータを使い果たすと、スパイク制御ポリシーによって要求がキューに登録され、設定に従って再試行されます。複数回の再試行後もクォータが残っていない場合、要求は拒否されます。他の要求用のクォータは、最初の要求がポリシーで設定されている時間制限を超えてから使用可能になります。このようにして、要求が循環して処理されます。

複数のウィンドウを設定できますか?

いいえ。 スパイク制御ポリシーにより、バックエンドサーバーが処理容量を超えた数の要求を処理しないことが保証されます。説明責任を果たす必要がある場合は、レート制限 SLA ポリシーまたはレート制限ポリシーを使用してください。

各レスポンスヘッダーの意味は?

各レスポンスヘッダーは、要求の現在の状態に関する情報を返します。

  • X-Ratelimit-Remaining: 現在使用可能なクォータ量

  • X-Ratelimit-Limit: 各ウィンドウで使用可能な最大要求数

  • X-Ratelimit-Reset: 最も古い要求がスライディングウィンドウの外に出るまでの残り時間 (ミリ秒)。

    クォータがまだ使用できる場合、引き続きアルゴリズムで新しい要求を処理できるため、ヘッダーは 0 (ゼロ) に設定されます。

デフォルトでは、応答の X-RateLimit ヘッダーは無効になっています。これらのヘッダーを有効にするには、ポリシーの設定時に ​[Expose Headers (ヘッダーを公開)]​ を選択します。

レート制限 SLA やスパイク制御ではなくレート制限 SLA ポリシーを使用する必要がある状況は?

レート制限 SLA ポリシーとレート制限 SLA ポリシーは、説明責任を果たすためにハード制限を (レート制限で識別子を使用して) グループまたは (レート制限 SLA を使用して) クライアントアプリケーションに適用する場合に使用します。バックエンドを保護するには、代わりにスパイク制御を使用してください。