このトピックでは、特定のキーと値に基づいてトークンレート制限を実行する ai-token-ratelimit プラグインについて説明します。キーと値は、URL パラメーター、HTTP リクエストヘッダー、クライアント IP アドレス、コンシューマー名、または Cookie のキー名から取得されます。
ai-token-ratelimit プラグインと AI 可観測性プラグイン を同時に有効にして、トークン数をカウントする必要があります。
実行属性
プラグイン実行ステージ: デフォルトステージ。プラグイン実行優先度: 600。
構成の説明
構成項目 | データ型 | 必須 | デフォルト値 | 説明 |
rule_name | string | はい | - | レート制限ルールの名前。レート制限ルール名、レート制限タイプ、レート制限キー名、およびレート制限キーの実際の値を Redis キーに連結できます。 |
rule_items | オブジェクトの配列 | はい | - | 指定された項目シーケンスに基づいてレート制限ルールを照合するために使用される項目。項目に基づいてレート制限ルールが一致した場合、他のルールを照合する必要はありません。 |
rejected_code | int | いいえ | 429 | リクエストが調整されたときに返される HTTP ステータスコード。 |
rejected_msg | string | いいえ | リクエストが多すぎます | リクエストが調整されたときに返されるレスポンスの本文。 |
redis | object | はい | - | Redis 関連の構成。 |
次の表は、rule_items の構成フィールドについて説明しています。
フィールド | データ型 | 必須 | デフォルト値 | 説明 |
limit_by_header | string | いいえ。 | - | レート制限のキー値を取得するために使用される HTTP リクエストヘッダーの名前。 |
limit_by_param | string | いいえ。 | - | レート制限のキー値を取得するために使用される URL パラメーターの名前。 |
limit_by_header | string | いいえ。 | - | レート制限のキー値を取得するために使用される HTTP リクエストヘッダーの名前。 |
limit_by_param | string | いいえ。 | - | レート制限のキー値を取得するために使用される URL パラメーターの名前。 |
limit_by_consumer | string | いいえ。 | - | レート制限のキー値を取得するために使用される HTTP リクエストヘッダーの名前です。システムは、ルールに基づいて特定の HTTP リクエストヘッダーを照合し、各リクエストヘッダーに基づいてレートを個別に計算します。 |
limit_by_cookie | string | いいえ。 | - | レート制限のキー値を取得するために使用される URL パラメーターの名前です。システムは、ルールに基づいて特定の URL パラメーターを照合し、各 URL パラメーターに基づいて個別にレートを計算します。 |
limit_by_per_header | string | いいえ。 | - | レート制限のキー値を取得するために使用される HTTP リクエストヘッダーの名前。システムはルールに基づいて特定の HTTP リクエストヘッダーを照合し、各リクエストヘッダーに基づいてレートを個別に計算します。 |
limit_by_per_param | string | いいえ。 | - | レート制限のキー値を取得するために使用される URL パラメーターの名前。システムはルールに基づいて特定の URL パラメーターを照合し、各 URL パラメーターに基づいてレートを個別に計算します。 |
limit_by_per_consumer | string | いいえ。 | - | レート制限のキー値を取得するために使用される IP アドレス。リクエストヘッダーから IP アドレスを取得するために、 |
limit_keys | オブジェクトの配列 | はい | - | 特定のキー値が一致した後にレート制限がトリガーされる回数。 |
次の表は、limit_keys の構成フィールドについて説明しています。
フィールド | データ型 | 必須 | デフォルト値 | 説明 |
key | string | はい | - |
|
token_per_second | int | いいえ。 | - | 1 秒あたりにリクエストできるトークンの数。 |
token_per_minute | int | いいえ。 | - | 1 分あたりにリクエストできるトークンの数。 |
token_per_hour | int | いいえ。 | - | 1 時間あたりにリクエストできるトークンの数。 |
token_per_day | int | いいえ。 | - | 1 日あたりにリクエストできるトークンの数。 |
次の表は、limit_keys の構成フィールドについて説明しています。
フィールド | データ型 | 必須 | デフォルト値 | 説明 |
service_name | string | はい | - | Redis サービス名。my-redis.dns や redis.my-ns.svc.cluster.local などの特定のサービスタイプを持つ完全修飾ドメイン名 (FQDN) です。 |
service_port | int | いいえ | サービスタイプが静的サービスの場合、デフォルト値は 80 です。その他のサービスの場合、デフォルト値は 6379 です。 | ApsaraDB for Redis インスタンスのサービスポート番号。 |
ユーザー名 | 文字列 | いいえ | - | ApsaraDB for Redis インスタンスにログオンするために使用されるユーザー名。 |
パスワード | 文字列 | いいえ | - | ApsaraDB for Redisインスタンスにログオンするために使用するパスワード。 |
key | string | はい | - | ApsaraDB for Redisインスタンスの接続タイムアウト期間です。単位:ミリ秒。 |
設定例
apikey パラメーターに基づいてリクエストを識別し、リクエストに対して異なるレート制限操作を実行します。
rule_name: default_rule
rule_items:
- limit_by_param: apikey
limit_keys:
- key: 9a342114-ba8a-11ec-b1bf-00163e1250b5
token_per_minute: 10
- key: a6a6d7f2-ba8a-11ec-bec2-00163e1250b5
token_per_hour: 100
- limit_by_per_param: apikey
limit_keys:
# 正規表現を使用して、a で始まるすべての文字列を照合します。 apikey パラメーターに一致する各リクエストに対して、1 秒あたり 10 トークン (TPS) が許可されます。
- key: "regexp:^a.*"
token_per_second: 10
# 正規表現を使用して、b で始まるすべての文字列を照合します。 apikey パラメーターに一致する各リクエストに対して、1 分あたり 100 トークン (TPM) が許可されます。
- key: "regexp:^b.*"
token_per_minute: 100
# すべてのリクエストが照合されます。 リクエストごとに、1 時間あたり 1,000 トークン (TPH) が許可されます。
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.staticリクエストヘッダー x-ca-key に基づいてリクエストを識別し、リクエストに対して異なるレート制限操作を実行します。
rule_name: default_rule
rule_items:
- limit_by_header: x-ca-key
limit_keys:
- key: 102234
token_per_minute: 10
- key: 308239
token_per_hour: 10
- limit_by_per_header: x-ca-key
limit_keys:
# 正規表現を使用して、a で始まるすべての文字列を照合します。 apikey パラメーターに一致する各リクエストに対して、10 TPS が許可されます。
- key: "regexp:^a.*"
token_per_second: 10
# 正規表現を使用して、b で始まるすべての文字列を照合します。 apikey パラメーターに一致する各リクエストに対して、100 TPM が許可されます。
- key: "regexp:^b.*"
token_per_minute: 100
# すべてのリクエストが照合されます。 リクエストごとに、1,000 TPH が許可されます。
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.staticリクエストヘッダー x-forwarded-for に基づいてピア IP アドレスを取得し、リクエストに対して異なるレート制限操作を実行します。
rule_name: default_rule
rule_items:
- limit_by_per_ip: from-header-x-forwarded-for
limit_keys:
# 正確な IP アドレスが使用されます。
- key: 1.1.1.1
token_per_day: 10
# CIDR ブロックが使用されます。 CIDR ブロック内の各 IP アドレスに対して、1 日あたり 100 トークン (TPD) が許可されます。
- key: 1.1.1.0/24
token_per_day: 100
# デフォルトでは、IP アドレスごとに 1,000 TPD が許可されます。
- key: 0.0.0.0/0
token_per_day: 1000
redis:
service_name: redis.staticコンシューマーに基づいてリクエストを識別し、リクエストに対して異なるレート制限操作を実行します。
rule_name: default_rule
rule_items:
- limit_by_consumer: ''
limit_keys:
- key: consumer1
token_per_second: 10
- key: consumer2
token_per_hour: 100
- limit_by_per_consumer: ''
limit_keys:
# 正規表現を使用して、a で始まるすべての文字列を照合します。 特定のコンシューマーに一致する各リクエストに対して、10 TPS が許可されます。
- key: "regexp:^a.*"
token_per_second: 10
# 正規表現を使用して、b で始まるすべての文字列を照合します。 特定のコンシューマーに一致する各リクエストに対して、100 TPM が許可されます。
- key: "regexp:^b.*"
token_per_minute: 100
# すべてのリクエストが照合されます。 リクエストごとに、1,000 TPH が許可されます。
- key: "*"
token_per_hour: 1000
redis:
service_name: redis.staticCookie のキーと値のペアに基づいてリクエストを識別し、リクエストに対して異なるレート制限操作を実行します。
rule_name: default_rule
rule_items:
- limit_by_cookie: key1
limit_keys:
- key: value1
token_per_minute: 10
- key: value2
token_per_hour: 100
- limit_by_per_cookie: key1
limit_keys:
# 正規表現を使用して、a で始まるすべての文字列を照合します。 特定の Cookie 値に一致する各リクエストに対して、10 TPS が許可されます。
- key: "regexp:^a.*"
token_per_second: 10
# 正規表現を使用して、b で始まるすべての文字列を照合します。 特定の Cookie 値に一致する各リクエストに対して、100 TPM が許可されます。
- key: "regexp:^b.*"
token_per_minute: 100
# すべてのリクエストが照合されます。 リクエストごとに、1,000 TPH が許可されます。
- key: "*"
token_per_hour: 1000
rejected_code: 200
rejected_msg: '{"code":-1,"msg":"Too many requests"}'
redis:
service_name: redis.static