限流的含义:
在计算机网络中,限流就是控制网络接口发送或接收请求的速率,它可防止DoS攻击和限制Web爬虫。
限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被拒,这就影响了用户体验。所以一般需要在系统稳定和用户体验之间平衡一下。
1)固定窗口限流
-
单位时间只允许部分操作
-
例子:1小时只允许10个用户操作
优点:最简单
缺点:可能出现流量突刺
比如:前 59 分钟没有 1 个操作,第 59 分钟来了 10 个操作;第 1 小时 01 分钟又来了 10 个操作。相当于 2 分钟内执行了 20 个操作,服务器有高峰危险。
2)滑动窗口限流
单位时间只允许部分操作,但是这个单位时间是滑动的,需要指定一个滑动单位
比如滑动单位 1min: 开始前: 0s 1h 2h 一分钟后: 1min 1h1min
优点:能够解决上述流量突刺的问题,因为第59分钟时,限流窗口是 59min-1h59min,这段时间内能够接受10次请求,只要还在这个窗口内,更多的操作就会被拒绝。
缺点:实现相对复杂;限流效果和你的滑动单位有关,滑动单位越小,限流效果越好,但往往很难选取一个特别合适的滑动单位。
3)漏桶限流
以固定的速率处理请求(漏水),当请求桶满了后,拒绝请求。
把限制请求的容器想象成一个桶,每次有请求就往桶里面放一滴水(一个请求),这个桶是漏的,每隔固定单位它只会滴下来一滴水(一个请求),当桶的容量满了之后,就拒绝请求。
例如:我让他每秒处理10 哥请求,桶的容量是 10 ,每0.1s固定处理一个请求,如果1s内来了10个请求,都能处理完,但如果来了11个请求,最后那个请求就回溢出桶,被拒绝。
优点:能够一定程度上应对流量突刺,能够固定速率处理请求,保证服务器的安全
缺点:没有办法迅速处理一批请求,只能按顺序一个个来处理(固定速率的缺点)
4)令牌桶限流
解决了漏桶的缺点
管理员先 生成一批令牌,每秒生成 10 个令牌;当用户要操作前,先去拿到一个令牌,有令牌的人就有资格、能同时执行操作。拿不到令牌就等着
优点:能够并发的处理同时的请求,并发性能会更好
缺点(需要考虑的问题):存在时间单位选取的问题
(时间单位选短了,依旧拿不到令牌,选长了,就可能存在令牌在很早之前就被抢完的情况,但这个本身就是限流需要考虑的问题)
在实际运用时 ,3和4用的多一点
这两种算法怎么选取呢? 取决于你的业务场景
-
如果希望服务器以恒定的速率处理请求 , 就用漏桶限流
-
如果服务器允许并发操作,希望性能高一点,就用令牌桶限流
如果还有不理解的地方, 建议阅读文章:面试必备:4种经典限流算法讲解 - 掘金