You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Krakend v2.4.3限流异常:首次正常后续请求数不符求助

Krakend限流异常原因分析

你的Krakend配置如下:

{
"version": 3,
"name": "My lovely gateway",
"port": 8084,
"timeout": "3s",
"extra_config": {
  
},
"endpoints": [
{
  "endpoint": "/rate",
  "method": "GET",
  "output_encoding": "json",
  "extra_config": {
    "qos/ratelimit/router": {
      "max_rate": 5,
      "every": "1m",
      "capacity": 5
      }
  },
  "backend": [
    {
      "url_pattern": "/rate",
      "method": "GET",
     "host": [
          "http://127.0.0.1:8091/"
      ]
    }
  ],
  "input_query_strings":[
     "*"
  ],
  
  "input_headers": [
    "*"
  ]
}
]
}

出现限流不符合预期的问题,核心原因有两个:

1. 令牌桶算法与预期的固定窗口限流逻辑不匹配

你需要的是「1分钟内最多处理5次请求」的固定时间窗口限流,但qos/ratelimit/router采用的是令牌桶算法,参数逻辑和你的预期完全不符:

  • max_rate:5 + every:"1m":表示令牌生成速率为每1分钟补充5个(约每秒0.083个),并非“每分钟严格限制5次请求”。
  • capacity:5:是令牌桶的最大容量,允许一次性突发5次请求,但后续只要令牌生成到足够数量,就会继续放行请求,不会严格卡1分钟的窗口上限。

这种逻辑下,请求放行是随令牌生成逐步开放的,和你想要的“到点重置计数器”的固定窗口限流逻辑完全不同。

2. 多worker进程的令牌桶独立维护

Krakend默认会启动与CPU核心数一致的worker进程,每个worker都有独立的令牌桶实例,彼此不共享限流状态:

  • 重启后等待1-2分钟调用:每个worker的令牌桶都生成满了5个令牌,若机器是3核,3个worker合计有15个令牌,所以能处理12-13次请求(部分令牌因时间差未完全生成)。
  • 等待2-3分钟后连续调用:每个worker的令牌桶保持满容量,多worker的令牌总数超过5,所以连续调用7次才触发限流。
  • 等待30秒调用:每个worker的令牌桶在30秒内生成了约2.5个令牌,请求分散到不同worker后,总和能支持2-3次请求。

如果要实现你预期的全局固定窗口限流,需要改用基于共享存储的限流组件,比如qos/ratelimit/redis,通过Redis统一维护限流计数器,确保所有worker共用同一个限流状态。

内容的提问来源于stack exchange,提问作者Subham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:25:09