限流策略
限流策略是与调用方 API Key 和模型分开管理的配额规则。它可以按团队、成员、API Key、模型、模型名称或模型服务提供方选择流量,再把匹配请求划分到独立配额桶中。策略还可以在周期性时间窗口内暂停自身执行。
条件策略使用请求条件和可选的配额桶维度,是新配置的推荐形式。对于以单个 API Key、模型、团队或成员为目标的现有配置,仍可使用经典策略。
策略不会取代单个 API Key 或模型上配置的限制。AISIX 会同时评估所有匹配策略和这些资源上的限制;只有所有匹配配额桶都有容量,请求才会继续。
本指南介绍如何通过 AISIX Cloud 或开源 AISIX 网关配置并验证条件策略、维护经典策略,以及安排策略暂停时间。
准备工作
开始前,请准备以下内容:
- 了解 API Key 与模型限流中介绍的限制字段、计数器行为、存储选项和资源专属限制。
- 可以发送代理请求的模型别名和调用方 API Key。
- 对于按成员划分的示例:已绑定到所选团队和某个成员的调用方 API Key。
- 以下配置路径之一:
- AISIX Cloud,其中包含环境、已接入的网关和具有写权限范围的 Admin Token。
- 开源 AISIX 网关,以及可验证并重新加载的声明式资源文件。
导出用于验证示例的网关请求参数:
# AISIX_PROXY 末尾不包含斜杠或端点路径。
# 本地快速入门使用 http://127.0.0.1:3000。
export AISIX_PROXY="YOUR_AISIX_GATEWAY_URL"
export AISIX_MODEL="gpt-4o-prod"
export AISIX_API_KEY="YOUR_CALLER_API_KEY"
对于 AISIX Cloud,还需导出示例使用的控制平面参数和资源 ID:
# AISIX_CP 包含 /api,末尾不包含斜杠。
# 本地 On-Premises 快速入门使用 http://localhost:8080/api。
export AISIX_CP="YOUR_AISIX_CLOUD_ADMIN_API_BASE_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
export TEAM_ID="YOUR_TEAM_ID"
选择策略形式
策略有两种形式。在 AISIX Cloud 中,形式在创建后固定不变。对于开源 AISIX 网关,声明式资源文件中的条目必须只使用一种形式;混用两种形式的字段会导致加载错误。
- 条件策略(推荐):使用条件树匹配请求,按
group_by中的维度拆分计数器,并使用与调用方 API Key 和模型相同的七字段limits结构限制流量。控制台的 New policy 流程只会创建这种形式。 - 经典策略(旧版):通过
scope和scope_ref指定单个对象,并使用window搭配max_requests或max_tokens。Admin API 和资源文件仍支持现有经典策略。
新配置请使用条件策略。它可以复现每种经典作用域,并支持同一请求匹配多个策略。
配置条件策略
条件策略需要作出三个决定:哪些请求匹配、如何拆分计数器,以及每个配额桶可以使用多少流量。
{
"name": "algo-team-premium-models",
"conditions": [
{ "dimension": "team", "operator": "in", "value": ["<team-id>"] },
{
"logic": "or",
"children": [
{ "dimension": "model_name", "operator": "~~", "value": "^gpt-4" },
{ "dimension": "provider", "operator": "==", "value": "anthropic" }
]
}
],
"group_by": ["member"],
"limits": { "rpm": 20 }
}
使用条件匹配请求
conditions 中的顶层节点全部生效,形成 AND 关系。节点可以是单个条件,也可以是通过 logic: and 或 logic: or 组合嵌套 children 的分组。空列表或省略列表会匹配环境中的所有请求。
| 维度 | 值 | 说明 |
|---|---|---|
team | 团队 ID | 与调用方 API Key 的团队绑定匹配 |
member | 成员或用户 ID | 与调用方 API Key 的成员绑定匹配 |
api_key | 调用方 API Key ID | |
model | 模型 ID | 按实际分发的模型匹配;在模型组中指所选目标 |
model_name | 模型别名 | 支持跨别名的正则表达式匹配 |
provider | 模型服务提供方目录 ID,例如 openai 或 anthropic | 与实际分发模型的模型服务提供方匹配 |
在 AISIX Cloud 中,身份维度使用资源 ID,model_name 和 provider 使用字符串。对于开源 AISIX 网关,api_key 和 model 的值使用声明式资源文件中对应条目的 display_name。team 和 member 的值分别按原值匹配调用方 API Key 的 team_id 和 user_id。
操作符遵循 lua-resty-expr,与 APISIX 路由 vars 使用相同的表达式词汇:
| 操作符 | 含义 | 适用范围 |
|---|---|---|
== / ~= | 等于/不等于 | 所有维度 |
in | 值位于包含 1–64 个条目的列表中 | 所有维度 |
~~ / ~* | 区分/不区分大小写的正则表达式,最多 256 个字符 | model_name 和 provider |
negate: true | 反转条件或分组 | 任意节点 |
team、member、api_key 和 model 维度包含 ID,因此使用相等或列表操作符。不携带某个维度的请求既不匹配该维度上的条件,也不匹配其取反条件,但 or 分组中的其他分支仍可能匹配。一个策略最多包含 16 个条件,嵌套层级最多为 3 层。