限流策略
限流策略是与调用方 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。请从团队页面复制 TEAM_ID。
# AISIX_CP 包含 /api,且不含尾部斜杠
# 本地私有化部署快速入门使用 http://localhost:8080/api
export AISIX_CP="YOUR_AISIX_CLOUD_ADMIN_API_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 | 匹配实际分发的模型;当请求经模型组、语义路由器或 ensemble 路由时,还匹配调用方所寻址的组/路由器。因此组自身的 ID 会选中经它路由的每个请求,而某成员的 ID 无论直接调用还是经组到达都会匹配。negate 将两者一并排除。 |
model_name | 模型别名 | 与 model 相同的配对匹配,作用于显示名;支持跨别名的正则表达式匹配。 |
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 层。
把计数器拆分为配额桶
group_by 接受 team、member、api_key、model 和 provider。所选维度值的每种不同组合都会获得具有相同限制的独立配额桶。group_by 为空或省略时只创建一个共享配额桶。匹配但缺少所选配额桶维度的请求不受该策略约束。
常见模式包括:
- 团队共享池:匹配一个团队并将
group_by留空,使整个团队共享配额。 - 每成员默认配额:匹配一个团队并设置
group_by: [member],使每个成员获得独立配额 。可与团队共享池策略叠加,同时执行团队总量和成员上限。 - 公平共享模型:匹配一个模型并设置
group_by: [team],使每个团队获得独立配额。
设置限制
limits 接受 rps、rpm、rph、rpd、tpm、tpd 和 concurrency,至少需要一个字段。Token 限制会在响应或流报告用量后结算,详见限流字段与计数器行为。
请求窗口如何计数取决于策略引用的维度:
- 如果策略的条件和
group_by均不使用model、model_name或provider,AISIX 会在请求闸门处只预留一次。因此,仅匹配api_key、team或member的策略,即使请求发生重试或故障转移,也只消耗一个请求槽位。 - 如果策略的条件或
group_by使用模型属性,AISIX 会在明确实际分发模型的位置预留。直接模型请求在请求闸门处预留一次。对于路由或语义父模型,AISIX 会对每次目标尝试评估策略,包括同一目标的重试与故障转移。对于 ensemble 父模型,则会对每次 panel 或 judge 调用评估策略。每次预留都会消耗一个请求槽位,即使上游调用失败也不会退还。使用group_by: [model]时,每个实际分发的直接模型使用各自的配额桶。
action 为未来行为预留。目前唯一支持且默认的值是 reject,它会返回 HTTP 429。
完整的策略 Schema 和字段验证规则参见资源文件参考。
AISIX Cloud
在控制台中创建条件策略:
- 打开环境并选择 Rate limits。
- 选择 New policy,输入 Name。
- 在 Match conditions 下添加条件行。当策略需要任一条件满足或嵌套组合时添加条件分组。不设置条件表示匹配所有请求。
- 在 Quota buckets 下保留 Shared quota,或选择 Split by dimension 并选择维度。
- 在 Limits 网格中填写至少一个字段,然后选择 Create policy。
策略列表会把条件显示为标签,并使用括号和明确的 AND/OR 关系表示分组。编辑策略可以更改条件、配额桶和限制。更改配额桶维度集合会改变计数器 Key;仅编辑条件或限制不会重置现有计数器。
对于自动化,请通过 Admin API 创建策略。以下示例为一个团队中的每个成员提供独立的每分钟一次请求配额桶:
curl -sS -X POST "${AISIX_CP}/environments/${ENV_ID}/rate_limits" \
-H "Authorization: Bearer ${AISIX_TOKEN}" \
-H "Content-Type: application/json" \
--data-binary @- <<EOF
{
"name": "team-member-default",
"conditions": [
{ "dimension": "team", "operator": "in", "value": ["${TEAM_ID}"] }
],
"group_by": ["member"],
"limits": { "rpm": 1 }
}
EOF
成功请求返回 201 Created,策略会投射到已接入的网关。条件策略没有“每个对象只能一个”的限制,因此可以按场景需要叠加任意数量。列出、获取、更新和删除操作参见 AISIX Cloud Admin API 参考。
开源 AISIX 网关
替换 api_keys 中的 chat-app,然后将 team-member-default 添加到 rate_limit_policies。需要时创建策略集合,并保持其他资源不变:
api_keys:
- display_name: chat-app
key_env: CALLER_API_KEY
allowed_models:
- gpt-4o-prod
team_id: team-blue
user_id: user-alice
rate_limit_policies:
- name: team-member-default
conditions:
- dimension: team
operator: in
value: [team-blue]
group_by: [member]
limits:
rpm: 1
api_key 和 model 上的条件使用目标条目的 display_name。未知名称会导致加载错误。
❶ team_id 和 user_id 把调用方 API Key 绑定到团队和成员。team 条件匹配 Key 的 team_id;member 配额桶以其 user_id 为 Key。
❷ team 和 member 条件按原值匹配这些绑定。
❸ group_by: [member] 为每个已绑定成员提供独立的每分钟一次请求配额桶。
让验证命令可以访问调用方凭证:
export CALLER_API_KEY="${AISIX_API_KEY}"
验证完整资源文件并重新加载网关。