什么是限流削峰
限流削峰是对服务端进行流量控制的常见手段,控制QPS上限以达到减轻服务端负担的目的。一个好的限流削峰方案应该实现以下三条原则:
- 对系统入侵性小,与业务充分解耦,以降低维护成本
- 使用合适的限流模型,达到流量QPS的精准控制
- 高性能,响应迅速,尽量降低业务请求在限流逻辑上所花费的时间
限流削峰模式
限流削峰总体来讲有两种模式。
一是针对单机的限流,这种限流模式一般针对单结点服务系统或者在多结点集群服务中作为结点的保护策略。这种模式下,限流算法只需要在内存中实现即可。
二是针对集群的限流,这种限流模式会在集群维度进行限流,保证进入集群的流量维持在某一上限之下。这种限流模式无关乎集群中节点的数量,限流上限并不会随着集群中节点的增减而弹性变化,通常来讲会作为满足特殊诉求存在,比如受到下游服务的承载能力制约,需要合理控制进入集群的流量,防止下游服务过载。这种模式下,限流算法需要结合一个集群中每个节点都能访问的存储中介去实现,一般来讲redis会充当这个中介。
限流模型
目前主流的限流模型主要有四种:
1. 固定时间窗模型
通过限制时间段内的请求通过数进行限流。
优点:限流逻辑简单,redis限流响应速度快。
缺点:流量限制不够精确,容易造成最大双倍QPS的误差,无法限制突发流量。
应用场景:大但均匀、突发变化较少的流量,需要快速限流响应。
2. 令牌桶模型
设置一个令牌桶,匀速往令牌桶中添加令牌,请求通过时需要获取令牌桶中的令牌,未获取则拒绝请求。
优点:相较于时间窗模型对限流控制的更加精确,能够更好的应对突发流量,同时模型限流具有良好的伸缩性,平滑性
缺点:限流逻辑较为复杂,redis实现需要适用redis事务,限流响应速度相较于滑动窗口会略慢一些
应用场景:应对突发流量,维持平均qps
3. 漏斗模型
每隔相同的时间间隔通过一个请求,其他请求均阻塞或者拒绝,强行限制数据的传输速率
优点:此模型下的qps限制最为精确,适用于精确限流,请求的业务阻塞时间较长、短时间内可处理的请求较少的情况
缺点:由于系统时间精度,所以qps限制上限为1000。由于限流的强制性,无法应对突发流量
应用场景:qps较小,严格限制qps,系统存在较多请求阻塞
4. 滑动窗口模型
设置固定窗口长度len,限制任意时刻区间 [current-len, current]内的请求数总数
优点:限流精确,能够应对突发流量
缺点:占用redis空间较大,限流响应较慢
应用场景:redis空间足够,流量变化较大,对qps有强限制
限流削峰实现
限流器实现仓库地址:https://github.com/HelloWorld-Ian/RateLimiter
限流削峰是控制服务端流量的重要手段,涉及固定时间窗、令牌桶、漏斗和滑动窗口等模型。本文探讨了不同限流模型的优缺点及其适用场景,并提供了限流器的实现仓库链接。
566

被折叠的 条评论
为什么被折叠?



