1、限流算法简介
每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。
限流的算法是参考水流建立模型的,常用限流算法有两种:漏桶算法和令牌桶算法。
漏桶算法:
水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求。可以看出漏桶算法能强行限制数据的传输速率。
因为漏桶的漏出速率(这个是系统处理能力决定的)是固定的参数,所以漏桶算法对于存在突发特性的流量来说缺乏效率。
令牌桶算法:
随着时间流逝,系统会按恒定1/QPS时间间隔往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。
令牌桶算法可以方便地改变速率,一旦需要提高速率,则按需提高放入桶中的令牌的速率。
2、RateLimiter简介
Google开源工具包Guava提供了限流工具类RateLimiter,该类基于令牌桶算法来完成限流。其基本思路是:通过限制请求流入的速度,即通过设定加入令牌的速率来控制请求的处理。实现原理如下:
1)内部维护一个秒表,秒表记录上一次请求的时间,新请求到来时,比较这个时间差和1/QPS,如果这个时间差比1/QPS要短,那么就不接收这个请求。有阻塞和非阻塞两种方式,请求方来选择是否立即返回。
2)RateLimiter只记录上一个请求到来的时间,如果中间很长时间都没有请求,说明利用不充分。这时候会有storedPemits记录未被利用的令牌数。当storedPemits越大,那么接下来接收请求的能力就越强。
3)如果有昂贵的请求到来,也可以立即执行,但接下来的请求必须等到正确的时间才能继续执行。
参考资料:
https://blog.csdn.net/tianyaleixiaowu/article/details/74942405