场景

在使用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
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐