Flex Gateway新着情報
Governance新着情報
Monitoring API Managerポリシー名 |
レート制限 |
概要 |
一定期間に処理される要求の最大数を定義することで、API へのアクセスを監視します。 |
カテゴリ |
サービス品質 |
使用可能な最小 Flex Gateway バージョン |
v1.2.0 |
返される状況コード |
429 - クォータを超過しました。現在のウィンドウが完了するまで要求はブロックされます。 |
レート制限ポリシーにより、API が特定の期間中に受け取ることができる要求数を制限することで、API への受信トラフィックを制御できます。この制限に達すると、ポリシーはすべての要求を拒否して、バックエンド API の負荷増大を回避します。
レート制限ポリシーを設定するときには、クォータ (要求数) と時間ウィンドウ (期間) の値を自由に組み合わせて指定できます。
Flex Gateway API に適用されるレート制限ポリシーは、ゲートウェイではなくレプリカにスコープ設定されます。 |
ローカルモードでは、宣言型の設定ファイルを使用してレート制限ポリシーを API に適用します。以下のポリシー定義とパラメーターの表を参照してください。
- policyRef: name: rate-limiting-flex config: rateLimits: <array> // REQUIRED - maximumRequests: <int> // REQUIRED timePeriodInMilliseconds: <int> // REQUIRED keySelector: <string> // OPTIONAL exposeHeaders: <bool> // OPTIONAL, default: false clusterizable: <bool> // OPTIONAL, default: true
パラメーター | 必須または省略可能 | デフォルト値 | 説明 |
---|---|---|---|
|
必須 |
なし |
1 つ以上のレート制限仕様を含むマップ |
|
必須 |
なし |
ウィンドウで使用可能なクォータ値 |
|
必須 |
なし |
クォータが適用される時間 (数値) |
|
省略可能 |
なし |
DataWeave 式で解決される各値の独立したカウンターでグループを作成するセレクターキー文字列。 たとえば、 |
|
省略可能 |
|
応答の一部として x-ratelimit ヘッダーを公開するかどうかを定義するブール値オプション |
|
省略可能 |
|
Distributed (分散): このフラグを有効にして相互接続されたランタイムを使用する場合、クォータはすべてのノード間で共有されます |
次の例では、レート制限を 6 秒ごとに 3 件の要求として定義しています。
- policyRef: name: rate-limiting-flex config: rateLimits: - maximumRequests: 3 timePeriodInMilliseconds: 6000 keySelector: "#[attributes.method]" exposeHeaders: true clusterizable: false
#[attributes.method]
DataWeave 式は、HTTP で使用できるメソッドごとに異なるグループを作成します。たとえば、ポリシーレート制限の GET 要求のグループを POST 要求とは別に作成します。
分散レート制限では、共有ストレージを有効にする必要があります。共有ストレージについての詳細は、「接続モードでの Flex Gateway の共有ストレージの設定」を参照してください。
--- apiVersion: gateway.mulesoft.com/v1alpha1 kind: Configuration metadata: name: shared-storage-redis spec: sharedStorage: redis: address: redis:6379 user: user password: pass DB: 1 --- - policyRef: name: rate-limiting-flex config: rateLimits: - maximumRequests: 3 timePeriodInMilliseconds: 6000 keySelector: "#[attributes.method]" exposeHeaders: true clusterizable: true
UI からレート制限ポリシーを API に適用する場合は、次のパラメーターを設定できます。
パラメーター | 説明 | 例 |
---|---|---|
Identifier (識別子) |
DataWeave または正規文字列を使用したセレクターキー |
|
Number of Reqs (要求の数) |
ウィンドウで使用可能なクォータ |
正の数 |
Time Period (期間) |
クォータが適用される時間 |
正の数 |
Time Unit (時間単位) |
時間の単位 (ミリ秒、秒、分、時) |
Minutes (分) |
Distributed (分散) |
このフラグを有効にして相互接続されたランタイムを使用する場合、クォータはすべてのノード間で共有されます。 |
オンまたはオフ |
Expose Headers (ヘッダーを公開) |
応答の一部として x-ratelimit ヘッダーを公開するかどうかを定義するオプション |
オンまたはオフ |
レート制限ポリシーは、現在のウィンドウ (使用可能なクォータ) 内で要求数を監視し、使用可能なクォータが 0 より大きい場合にのみ、要求がバックエンドに到達できるようにします。
ポリシー設定で識別子を使用することで、複数の要求グループに対してポリシーを設定できます。各グループは、それぞれのウィンドウで別々の使用可能なクォータを持ちます。
レート制限ポリシーの仕組みをわかりやすくするため、10 秒ごとに 3 件の要求という設定で、ウィンドウ内のクォータに基づいて受信要求が許可または拒否される例を見てみましょう。
最初のウィンドウでは、3 番目の要求でクォータに達したため、以降の要求はウィンドウが終了するまで拒否されます。2 番目のウィンドウでは、3 件の要求のうち 2 件しか処理されていないため、ウィンドウが終了しても、残りのクォータは少なくなります。
受け入れられた要求は API を経由してバックエンドに送られます。一方、拒否された要求は 429 の HTTP 状況コード (API が WSDL であれば 400 または 500) を返してバックエンドには到達しません。
一方、拒否された要求は 429 の HTTP 状況コード (API が WSDL であれば 400 または 500) を返してバックエンドには到達しません。
上記の 10 秒ごとに 3 件の要求という設定で、レート制限ポリシーがクラスター用に設定され、識別子を使用する場合を考えてみましょう。
UI を使用してポリシー設定に識別子を追加することで、要求のグループを定義できます。設定された制限は、各グループに別々に適用されます。レート制限ポリシー設定では、HTTP メソッドごとに 1 つのバケットに対して識別子 #[attributes.method]
を使用できます。
UI の Identifier
は非必須パラメーターです。デフォルトでは Identifier
は値を持ちません。デフォルトを使用するか、または値を指定するかにより、ポリシーは次のように機能します。
未設定 (デフォルト)
レート制限は、バケットまたはグループごとにすべての要求に適用されます。
必須 HTTP ヘッダーを使用するように設定
各ヘッダーには個別のクォータが割り当てられます。ヘッダー値では大文字と小文字が区別されます。クォータは遅延作成を使用して作成されます。
非必須 HTTP ヘッダーを使用するように設定
カスタムヘッダー、ペイロード、クエリパラメーター、または式の値には、個別のクォータが割り当てられます。
識別子が要求で送信されない場合、デフォルトで空の値に設定され、独自のクォータが使用されます。この動作では、未制御のクライアントによってコンシュームされる API にレート制限ポリシーを適用できると同時に、識別子を送信するクライアントの特別なバケットに対応します。
次の例は、10 秒おきに 3 つの要求の設定で識別子 #[attributes.method]
を使用した場合に、一定期間に発生するイベントの順序を示しています。
この例では、
すべての HTTP メソッドでは 10 秒おきに 3 つの要求が許可されます (この例では、API に対して GET 要求と POST 要求のみが実行されています)。
レート制限ポリシーは、固定されたウィンドウで機能します。
詳細は、図中のウィンドウサイズの括弧を参照してください。
ウィンドウの開始時間は独立しています。
エンジンはメソッドの最初の要求を受信するとレート制限アルゴリズムをスプールする遅延作成戦略を使用します。
レート制限エンジンは HTTP に依存せず、DataWeave 式の解決のみに左右されます。複雑なレート制限シナリオに対応するために UI の Identifier
式を変更することができます。
たとえば、すべてのクラス A およびクラス C の LAN 要求に 1 つのバケット、それ以外の要求に別のバケットを使用する識別子をレート制限ポリシーに設定できます。次の画像は前の文の 2 つ目のバケットを示し、DataWeave 式 #[attributes.queryParam[‘customIdentifier’]]
をポリシー識別子として使用する 10 秒ごとに 3 件のクォータに相当します。
この例では、
識別子のない要求はすべて空の識別子に解決されます。したがって、1 つのレート制限アルゴリズムを使用します。
識別子ごとに異なるバケットが使用され、各バケットには独立したクォータが割り当てられます。
この設定では、要求を実行した IP の地域に対応する false または true のバケットが作成されます。false
値と true
値は、HTTP ではなくブール値のドメインに対応します。
いずれにせよ、エンジンは解決された式を文字列として扱うため、ポリシーは正常に機能します。この場合、値は自動的にブールから文字列にキャストされます。スクリプトに output text/plain ---
を追加することで、DataWeave でキャストを明示的に定義できます。
HTTP RFC のヘッダー名では、大文字と小文字は区別されません。MuleSoft HTTP 用 Anypoint Connector は、ヘッダー名を小文字に変換します。ただし、DataWeave キーでは大文字と小文字が区別されます。したがって、 |
すべての識別子結果では 1 つのアルゴリズムが使用されます。DataWeave 式が無制限の (非常に大規模な) 共用ドメインを返さないように注意して作成してください。このようなドメインが返されると、同じ数のアルゴリズムをメモリ内でホストしなければならなくなります (アルゴリズムが遅延作成戦略で作成されるため、可能なすべての識別子に対して最低 1 つの要求を実行する必要があります)。
たとえば、DataWeave 式で、インターネットに公開された Flex Gateway インスタンスでの識別子として IP アドレスを使用するとします。インターネット上のすべての公開 IPv4 IP がこのインスタンスに対して要求を実行すると、1 つのインスタンスで 3,706,452,992 件のアルゴリズムが実行されます。
アルゴリズムの平均サイズが 250 バイトであれば、レート制限アルゴリズムのサイズは約 1 テラバイトになります。そのため、有限数の識別子に解決される DataWeave 式を使用することで、結果のセットをできるだけ小さくしてください。
このウィンドウはいつ開始されますか?
このウィンドウは、ポリシーが正常に適用された後の最初の要求で開始されます。
アルゴリズムが使用するウィンドウの種別は?
固定ウィンドウです。
クォータを使い果たすとどうなりますか?
アルゴリズムは、最初の要求を受信したときにオンデマンドで作成されます。このイベントによって、期間が固定されます。各要求は、期間が終了するまで、現在のウィンドウの要求クォータをコンシュームします。
要求クォータを使い果たすと、レート制限ポリシーは要求を拒否します。ウィンドウが終了すると、要求クォータはリセットされ、同じ固定サイズの新しいウィンドウが開始されます。
複数の制限を定義するとどうなりますか?
ポリシーはウィンドウあたりの要求クォータ設定を使用して各制限のアルゴリズムを作成します。そのため、複数の制限が設定されている場合、要求が受け入れられるには、すべてのアルゴリズムに現在のウィンドウで使用可能な要求クォータが存在する必要があります。
各レスポンスヘッダーの意味は?
各レスポンスヘッダーは、要求の現在の状態に関する情報を返します。
X-Ratelimit-Remaining: 使用可能な要求クォータ
X-Ratelimit-Limit: 各ウィンドウで使用可能な最大要求数
X-Ratelimit-Reset: 新しいウィンドウが開始されるまでの残り時間 (ミリ秒)
デフォルトでは、応答の X-RateLimit ヘッダーは無効になっています。これらのヘッダーを有効にするには、ポリシーの設定時に [Expose Headers (ヘッダーを公開)] を選択します。
レート制限 SLA やスパイク制御ではなくレート制限ポリシーを使用する必要がある状況は?
レート制限ポリシーとレート制限 SLA ポリシーは、説明責任を果たすためにハード制限を (レート制限で識別子を使用して) グループまたは (レート制限 SLA を使用して) クライアントアプリケーションに適用する場合に使用します。バックエンドを保護するには、代わりにスパイク制御を使用してください。