基于Sentinel的微服务限流及熔断(一)常用算法

  • 计数器算法

计数器算法是一种比较简单的限流实现算法,在制定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期时进行访问次数的清零。

比如每一分钟能处理的请求数为100,在第一分钟的时间内,有个count计数,第一分钟执行了80次,在第二分钟时,count再从0开始计数,如果在第二分钟的前30秒已经处理了100个请求,则在后面的半分钟请求就会被拒绝。这种算法可以用在短信发送的频次上限制,比如限制某个用户一分钟之内触发的短信发送的次数

这种算法存在一个临界问题,即在0:58秒至1:02秒时分别出现了100个请求,就会出现4秒的可用时间,整体来看是4秒内的请求量达到了200,超出了设置的阈值。

  • 滑动窗口算法

为了解决计数器算法带来的临界问题,所以引入了滑动窗口算法。滑动窗口是一种流量控制技术,在TCP网络通信协议中,就采用了滑动窗口算法来解决网络拥塞的情况。

简单来说,滑动窗口算法的原理是在固定窗口中分隔出多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的计数即可。

比如将一分钟拆为4个小时间窗口,每个小时间窗口最多能够处理25个请求,滑动窗口的大小是2,所以这个窗口最多能够处理50个请求,同时滑动窗口会随着时间往前移动,比如前面10秒结束后,滑动窗口会滑动到10-40秒这个范围,然后在新的窗口中重新统计数据,这种方式很好的解决了固定窗口算法的临界值问题。Sentinel就是采用滑动窗口算法来实现的。

你可能感兴趣的:(sentinel,微服务,java)