对并发访问进行限速,达到限制的速率,触发限流行为。
限流策略
- 拒绝服务:有一个恶意的高并发请求导致请求量激增,限流系统察觉到异常情况,把这个客户端拒绝掉。
- 服务降级:把不重要的服务关掉,把系统资源让给重要的服务。不返回全量数据,只返回部分数据。
- 特权请求:资源有限只针对vip提供服务。
- 延时处理:有个队列来处理大量请求,如果队列满了,拒绝用户。如果队列中任务超时,返回系统繁忙。
- 弹性伸缩:监控系统感知繁忙的服务,伸缩服务避免系统挂掉。
限流实现方式
-
计数器:当一个请求来时,count计数器+1,请求处理完,count-1,如果count超过了设定阈值,拒绝请求加入。
-
队列算法:给每个队列分配权重,权重高的优先执行,其次权重低的在执行。
-
漏斗算法:把队列比作成一个漏斗,进来的水是访问量,出去的水就是系统处理。当访问流量过大导致漏斗积水,水太多就会溢出。
-
令牌桶算法:有一个箱子,发布任务的人把任务token放进箱子,你要从箱子里拿到任务token才能执行;如果拿不到,就不能处理。和漏斗算法有一个区别地方,漏斗以一个稳定的速度处理,令牌桶在流量小的时候攒着,等到流量大的时候,快速处理。
-
基于响应时间的动态限流:我们很难去准确设置阈值大小。我们采用一种动态限流方式,不需要特定的值,能够动态的感知系统压力来自动化地限流。
我们记录每次调用后端请求的响应时间,在过去10秒区间内的请求计算一个响应时间的P90或P99值,响应时间排序,看90%或99%的位置是多少。
限流设计
- 限流要在搭建架构前做好
- 限流模块对流量变化非常灵敏,太迟钝,系统因为过载而挂掉
- 限流加个手动开关,遇到突发情况,可以手动操作
- 限流发生,应该有监控事件通知
- 限流发生,被拒掉的请求,发一个限流错误码,客户端知道后,可以重试
- 限流让后端服务感知到,在HTTP Header中加入一个限流级别,告诉后端目前正在限流,根据标识决定是否降级。