跳到主要内容

入口限速

自 v1.5.0 起,Aidy Gateway 支持以租户为维度的入口限速能力。当前版本中,该能力基于 PostgreSQL tenants 表中的租户字段定义,并通过 routes.tenant_id 进行关联。启动前需要在静态配置中设置 rate-limit.redis,用于存储限速窗口。

响应头策略通过 plugin.inbound_rate_limit.InboundRateLimitPluginConfig 配置。

启用条件

入口限速插件只有在同时满足以下条件时,才会被挂进请求链路:

  1. 静态配置中提供了 rate-limit.redis
  2. Gateway 启动时成功初始化了入口限速 limiter
  3. 当前 route 绑定了 tenant
  4. tenant.inbound_rate_limit_qps > 0
  5. tenant.id 非空

如果以上任一条件不满足,入口限速插件不会进入当前 route 的请求链路。

配置步骤

  1. 在 PostgreSQL tenants 表中写入目标租户,并设置 inbound_rate_limit_qps / detect_rate_limit_cpm。例如:
{
"id": "tenant-a",
"inboundRateLimitQps": 120,
"detectRateLimitCpm": 2400
}
  1. 在 PostgreSQL routes 表中将目标 route 绑定到 tenant_id = tenant-a,Aidy Gateway 会在运行时将该路由归属于 tenant-a 并应用其限速。

  2. (可选)在路由的 plugin_config.inbound_rate_limit 中设置 headers_mode,控制限速相关响应头的返回策略。

当限额字段未填写或为 0 时,表示未启用对应的限速项。

需要注意的是,plugin_config.inbound_rate_limit.headers_mode 只控制响应头返回策略,不决定插件是否进入请求链路。

插件配置

入口限速由独立的 ratelimit-inbound 插件完成,运行在 Inbound 阶段。插件会自动根据路由绑定的租户 ID 调用 Redis 计数,并在达到上限时返回 429 Too Many Requests

plugin_config.inbound_rate_limit.headers_mode 支持以下取值:

说明
ALWAYS每次请求都返回限速相关响应头
ON_LIMIT默认值,仅在触发限速(返回 429)时返回响应头
NEVER不返回任何限速信息

插件使用的响应头包括:

  • X-RateLimit-Limit: 当前窗口允许的最大请求数(QPS)
  • X-RateLimit-Remaining: 剩余可用请求数
  • X-RateLimit-Reset: 当前窗口结束的剩余秒数
  • Retry-After: 触发限速时,建议客户端重试前等待的秒数(仅在 ALWAYS/ON_LIMIT 且被限速时返回)
  • Server: 当触发限速返回 429 时固定为 aidy

默认策略可通过静态配置的 rate-limit.headers_mode 指定,未设置时默认 on-limit

后续的限速执行逻辑会依赖租户级配置及插件行为执行业务侧的速率控制策略。

当前版本中,tenant 数据来源已经从 Redis 动态配置切换到 PG-only runtime。初始化方式建议参考: