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
相关产品推荐
相关产品推荐

