这个时候如果不做任何保护措施,服务器就会承受很大的处理压力,请求量很高,服务器负载也很高,并且当请求超过服务器承载极限的时候,系统就会崩溃,导致所有人都不能访问。
为了应用服务的高可用,一个常用的办法是对大流量的请求(秒杀/抢购)进行限流,拦截掉大部分请求,只允许一部分请求真正进入后端服务器,这样就可以防止大量请求造成系统压力过大导致的系统崩溃,从而保护服务正常可用。
令牌桶(Token Bucket) 、 漏桶(leaky bucket) 和 计数器 算法是最常用的三种限流的算法。
限流算法
计数器
计数器限流算法也是比较常用的,主要用来限制总并发数。比如限流 qps 为 100,算法的实现思路就是从第一个请求进来开始计时,在接下去的 1s 内,每来一个请求,就把计数加 1 ,如果累加的数字达到了 100 ,那么后续的请求就会被全部拒绝。等到 1s 结束后,把计数恢复成 0 ,重新开始计数。
这种实现方式有一个弊端:如果我在单位时间 1s 内的前 10ms ,已经通过了 100个请求,那后面的 990ms ,只能眼巴巴的把请求拒绝,这种现象称为 突刺现象。
漏桶
为了消除 突刺现象,可以采用漏桶算法实现限流,漏桶算法这个名字就很形象,算法内部有一个容器