场景
在使用SCG限流功能时,默认情况下是按秒限流,即一秒允许多少个请求,现需要根据不同时间频率进行限流,即限制每分钟、每小时或者每天限流。
分析
SCG的限流使用的guava的ratelimiter工具,令牌桶模式,参数包括以下3个:
- replenishRate: 每次补充令牌数量
- burstCapacity: 令牌桶最大容量,突发请求数量
- requestedTokens: 每次请求消耗令牌的数量
使用方案
- 每秒限制请求1次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 1 requestedTokens: 1
- 每秒限制请求10次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 10 burstCapacity: 10 requestedTokens: 1
- 每分钟限制请求1次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 60 requestedTokens: 60
- 每分钟限制请求10次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 60 requestedTokens: 6
- 每小时限制请求1次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 3600 requestedTokens: 3600
- 每小时限制请求10次
- name: RequestRateLimiter #基于redis漏斗限流 args: key-resolver: "#{@myResolver}" redis-rate-limiter: replenishRate: 1 burstCapacity: 3600 requestedTokens: 360
其他频率以此类推,调整三个参数即可。
其他
当触发限流过滤时,在SCG会在redis插入2个key,分别是
- request_rate_limiter.{key}.tokens:当前令牌数,访问时根据令牌数判断是否有资源访问
- request_rate_limiter.{key}.timestamp:上一次访问时间,用于访问时计算上一次到这一次可增长的令牌数,并增加到tokens中。
- TTL:redis中限流key过期时间,规则为burstCapacity/replenishRate*2s, 如1分钟限流key过期时间为60/1*2s=120s