1、计数器算法
计数器算法又叫固定窗口算法,是限流算法中比较简单的一种,它是使用计数器在一定周期内对访问次数进行累加,当次数达到阈值时,触发限流策略,在进入下一周期时,就会清空访问次数,并重新计数
//AtomicLong 类支持线程安全的自增自减操作
private AtomicLong atomicLong=new AtomicLong(1);
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01() throws InterruptedException {
//consumerService.doGetResource();
//获取自增对象的值,然后再加1
long num=atomicLong.getAndIncrement();
当然这个算法也有弊端:临界问题
假设1min内服务器的负载能力为100,因此一个周期的访问量限制在100,然而在第一个周期的最后5秒和下一个周期的开始5秒时间段内,分别涌入100的访问量,虽然没有超过每个周期的限制量,但是整体上10秒内已达到200的访问量,已远远超过服务器的负载能力,由此可见,计数器算法方式限流对于周期比较长的限流,存在很大的弊端。
2、滑动窗口算法
滑动窗口算法是将各个时间周期进行划分,分成几个小周期,然后对小周期内的访问次数进行记录,当划过一个小周期就会被删除过期的周期。当时间周期划分的越多小周期,那么滑动窗口的滚动就越平滑,限流的统计就会越精确。
此算法很好的解决计数器算法的临界问题。
3、漏斗算法
由名字不难看出,这个算法是将到达的访问请求放入一个漏斗中,以固定的速率进行放行,当漏斗中的访问请求达到阈值时,并直接进行丢弃,触发限流策略
4、令牌桶算法
令牌桶算法是程序以时间周期/限流值的速度向令牌桶中增加令牌,直到令牌桶满,请求到达时向令牌桶请求令牌,如获取到令牌则通过请求,否则触发限流策略
-
Sentinel 默认的限流算法是 滑动窗口算法