限流
what-->why-->how
1.什么是限流
在开发高并发系统时,有很多手段来保护系统,如缓存、降级和限流等。缓存目的是提升系统访问速度和增大系统处理能力,可谓是抗高并发流量的银弹。而降级是当服务出问题或者影响到核心流程的性能,需要暂时屏蔽掉,待高峰过去或者问题解决后再打开的场景。而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页)等。因此,需有一种手段来限制这些场景下的并发/请求量,这种手段就是限流。
2.目的
限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。在压测时我们能找出每个系统的处理峰值,然后通过设定峰值阈值,来防止当系统过载时,通过拒绝处理过载的请求来保障系统可用。另外,也应根据系统的吞吐量、响应时间、可用率来动态调整限流阈值。先有缓存这个银弹,后有限流来应对618、双11高并发流量,在处理高并发问题上可以说是如虎添翼,不用担心瞬间流量导致系统挂掉或雪崩,最终做到有损服务而不是不服务。
3.常见限流手段
一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如 Nginx 的limit_conn模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如Guava的RateLimiter、Nginx 的 limit_req模块,用来限制每秒的平均速率),以及限制远程接口调用速率、限制MQ的消费速率等。另外,还可以根据网络连接数、网络流量、CPU或内存负载等来限流。
4.注意事项
限流需要做好评估,不可卵用,否则正常流量会出现一些问题。
5.限流算法
5.1令牌桶
一个存放固定容量的桶,按照固定速率往桶里添加令牌。
特点
允许突发
固定速率添加
5.2漏桶
一个存放固定容量的桶,按照固定速率流出水滴。
特点
平滑突发流量
常量流出
6.应用级限流
6.1限制总并发数/连接数/请求数
6.2限流总资源数
数据库连接,线程池等稀缺资源,可以考虑池化(连接池、线程池)
6.3限流某个接口总的并发数、请求数
特殊业务,如秒杀、抢购。可以限制核心接口的总并发或者总请求数。
6.4限流某个接口的时间窗请求数
接口限速,避免挂掉
6.5平滑限流某个接口的请求数
7.接入层限流
nginx限流
8.节流
在特定时间窗口内对重复的相同时间最多只处理一次