为什么要限流?
后台服务能力优先,如果不进行限流的话,仍有全部流量打到服务器上,可能会引起服务器瘫痪。当我们进入网站,网站显示”系统繁忙,请稍后再试“时,就是在进行限流。
可以根据性能测试区评估限流的设置,例如测试最大连接数,QPS数。
说明,这些算法实际上并不是一个具体实现,这只是一种模型,有很多种实现方式。
1、计数器
计数器限流方式比较粗暴,一次访问设置一次计数,在系统内设置每秒的访问量,超过访问量的访问直接丢弃,实现访问限流.
比如可以使用redis进行1S的100次访问计数,来一个流量100-1当数量到达0时,拒绝后续的访问.也可以不拒绝而是将请求放入缓存队列,根据实际业务情况选择不同的实现方式.
缺点:在开始的时间,访问量被使用完后,1S内会有长时间的真空期是处于接口不可用的状态的.
2、漏桶
优点就是,有一定的缓存能力。
缺点就是,桶满时,如果有新的请求进入,会丢弃该数据。长时间桶满,则会影响响应速率。
3、令牌桶
令牌桶和漏桶不同的地方在于:
- 令牌桶可以自己控制生成令牌的速率,例如高峰期就可以多生成一些令牌来满足客户端的需求
- 还可以缓存数据
若发现一直是出于高峰期,可以考虑扩大令牌桶
优势:令牌桶可以根据自己控制令牌生成的速率,还可以缓存数据。
2.1 网关层限流
这种方式与前面提及的漏斗相似,或者说这二者本身就是一样的,不过漏洞算法是种模型,而网关层限流的话更像是一种具体实现。
从图中可以发现,这基本就是我们日常请求的一个流程:
- 用户流量从网关层到后台服务
- 后台服务承接流量,调用缓存获取数据
- 缓存中无数据的情况下,则回源头查询数据库。
该模型也被称为【漏斗模型】,因为流量自上而下是递减的,在网关层聚集了最为密集的用户访问请求,其次才是后台服务,经过服务验证之后,刷掉一部分错误请求,剩下的请求落到缓存中,如果没有缓存的情况下才是最终的数据库层,所以数据库请求频次是最低的。
在此,在补充两个概念——【降级】、【熔断】
降级
什么是降级?
降级就是当服务器压力剧增时,为了保证核心业务功能模块的高可用,降低非核心模块的功能。比如淘宝双十一时,在零点双十一时,会关闭确认订单,评价等非核心模块,保证秒杀功能的高可用。
熔断
在依赖的外部接口出现故障的情况下,会设置断绝和外部接口的关系。
服务器A依赖于服务器B的对外接口,在某个时刻服务器B的接口出现异常,响应时间极其的慢,可是此接口会影响到服务器的整个运作,那么这个时候,服务器A就可以在请求服务器B该接口的时候,默认设置返回错误。