就是在大数据高并发系统中防止调用方过度调用系统造成系统崩溃或者影响其他调用者的一种技术手段。对于我们个人开发者来说,限流更多是为了防止Dos攻击和web爬虫,尤其是你如果开了一些付费服务,那就更要小心了。
设定一个固定的时间,在固定的时间内,请求总次数少于阈值,则请求通过,否则拒绝请求。
但是这种算法有一个很明显的问题,如果在n个固定时间的后半部分请求到阈值数量的请求,n+1个固定时间的前半部分也请求到阈值,那么,n的后半部分和n+1的前半部分这个固定时间的请求数量就变成了阈值的2倍,但是依然允许请求,这于我们的设计相悖。
与固定窗口算法相比,滑动窗口是将固定的时间再分为几份,区块不断向前移动,每次一份,在该区块内请求需要低于阈值,解决了固定窗口限流的缺点。
那这个有什么缺点呢,虽然解决了超阈值请求问题,但是超过阈值的请求都被暴力拒绝了,这样用户体验很差。
像是一个底部有漏洞的桶,请求像是加入桶中的水,漏洞以固定速率处理请求。只有当桶的容量已满,才会拒绝请求。
优点:面对突发的流量更有优势,能以固定的速率处理请求,保护系统安全,有一个桶的流量作为容器来存放请求。
首先,我们有一个固定容量的桶,桶里存放着令牌(token)。桶一开始是空的,token以一个固定的速率往桶里填充,直到达到桶的容量,多余的令牌将会被丢弃。每当一个请求过来时,就会尝试从桶里移除一个令牌,如果没有令牌的话,请求无法通过。
令牌桶与漏桶算法的区别在于:漏桶处理请求的速度是固定的,而令牌桶能够并发处理请求,只要获取到令牌的请求都有资格被处理。