文章目录
最常用的限流算法以及如何在http中间件中加入流控
何为限流?
通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
说白了就是限制请求数量,或者是在某一段时间内限制总的请求数量
例如秒杀网站,限制22点5分 – 22点10分 秒杀999份产品, 限制放行 5w 个请求,若在该段时间内,请求在第5w以后的请求,直接拒之门外, 也就是我们在进入网站的时候显示,系统繁忙
为什么要限流?
- 后台服务能力有限,需要限流,否则服务会崩掉
- 可以根据测试性能去评估限流的设置,例如测试最大连接数,qps数量(每秒钟能处理的最大请求数)
- 防止爬虫、恶意攻击
例如当系统的访问量突然剧增,大量的请求涌入过来,我们可能会知道会突然有一波高峰,这个时候如果服务器承受不了压力的话,就会崩溃,例如如下几类业务
- 秒杀业务
- 各种刷单
- 微博上的热搜
- 因为某些原因用户猛增,太过热情
- 大量用户(可以是恶意的,也可以是正常的用户量请求过多)高频访问服务器,服务器承受能力不足
- 网页爬虫 等等
限流一般是如何去实现的?
我们在某宝或某东的热门节日上剁手,付款的时候,还急我们怀着焦灼的心等待着排队的人数一个一个下降的时候吗?
我们在疯狂抢购商品,由于点击太快,热情太高,导致多次弹出系统繁忙,请稍后再试,还记得吗?
更有甚者,在流量过大的时候,直接提示拒绝访问的,这些是不是都一一浮现在脑海呢?
根据如上场景,我们的限流思路会是这个样子的:
- 拒绝请求
- 设置排队,直到单位请求数趋于正常水平
关于拒绝请求就相对简单粗暴,对于设置排队就会有多种排队方式了,咱们继续聊
除了限流还有什么方式可以解决或者缓解这种突然大量请求的情况呢?
还有熔断,降级,都可以有效的解决这样的问题
那啥是降级?
即服务降级,当我们的服务器压力剧增时,为了保证核心模块的高可用,这里指的是我们自身的系统出现了故障而降级,有如下2个**常用的解决方式
- 降低非核心模块的性能
- 直接关闭不重要的功能,为保障核心模块的功能正常
如图,某网站,当用户请求数猛增,服务器吃不消的时候,就可以选择把评论功能,修改密码等功能关闭,确保支付系统,数据系统等核心功能能够正常运行
哦?那熔断是啥?
与服务降级还是有区别的,这里指的是指依赖的外部接口出现故障的情况下,会设置断绝和外部接口的关系。
服务器A依赖于服务器B的对外接口,在某个时刻服务器B的接口出现异常,响应时间极其的慢,可是此接口会影响到服务器的整个运作,那么这个时候,服务器A就可以在请求服务器B该接口的时候,默认设置返回错误
最常用的限流算法
我们来分享一个最常用的限流算法,大致分为以下 4 种
- 固定窗口计数器
- 滑动窗口计数器
- 漏桶
- 令牌桶
固定时间窗口控制
最简单的是 使用计数器来控制,设置固定的时间内,处理固定的请求数