本文最后更新于343 天前,其中的信息可能已经过时,如有错误请发送邮件到3368129372@qq.com
单机限流
-
Guava RateKimiter(google开源)
示例代码:import com.google.common.util.concurrent.RateLimiter; public static void main(String[] args) { // 每秒限流5个请求 RateLimiter limiter = RateLimiter.create(5.0); while (true) { if (limiter.tryAcquire()) { // 处理请求 } else { // 超过流量限制,需要做何处理 } } }
分布式限流
使用redission自带的限流器rateLimiteer
@Resource RedissonClient redissonClient; public void doLimit(String key){ RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS); boolean b = rateLimiter.tryAcquire(2); if(!b){ throw new BusinessException(ErrorCode.TO_MANY_REQUEST); } }
算法
- 固定窗口计数限流算法:最简单的限流算法之一,它将请求或事件的到达速率限制在固定的窗口内。例如,每秒最多允许处理 10 个请求。这个算法的问题在于它无法平滑处理请求,因为在窗口边界可能会出现瞬间的高负载。
- 滑动窗口计数限流算法:这种算法改进了固定窗口算法,使用滑动窗口来平滑处理请求。窗口内的请求计数按照时间的流逝而衰减,从而减少了窗口边界的尖峰负载。
- 令牌桶算法:令牌桶算法使用令牌桶来控制请求速率。令牌以固定的速率被添加到令牌桶中,每个请求需要从令牌桶中获取一个令牌才能被处理。如果令牌桶中没有足够的令牌,请求将被延迟或拒绝。这种算法平滑控制了请求速率,并且可以处理突发请求。
- 漏桶算法:漏桶算法以恒定的速率漏水,当请求到达时,会尝试向漏桶中添加请求,如果漏桶已满,则请求被拒绝。漏桶算法可以平滑请求,但不能处理突发请求。