2023-03-27
碎碎念
00
请注意,本文编写于 667 天前,最后修改于 667 天前,其中某些信息可能已经过时。

目录

限流的多种方法
限流方法
固定窗口算法
滑动窗口算法
滑动日志算法
漏通算法
令牌桶算法

限流的多种方法

近期随着微服务流行,服务之间的依赖加深,为了防止某个服务的请求突增而给下游服务带来较大压力,往往需要采取方法来保证稳定性,往往就通过缓存、限流、熔断等级、负载均衡等多种方法保证,这里主要是讲限流

限流方法

即对请求或并发数进行限制,通过对一个时间窗口内的请求量进行限制保障系统正常运行
  • 阈值:在一个单位时间内允许的请求量,如QPS限制为10,说明1s内最多10次请求
  • 拒绝策略:超过阈值的请求的拒绝策略,常见的是直接拒绝、排队等待

固定窗口算法

又称计数器算法,通过一个支持原子操作的计数器来累计1s内的请求次数,当达到阈值时触发拒绝策略,每过1s计数器重置为0开始重新计数

但是这种方法有一定的问题,比如在时间窗口的临界处如果此时有大量请求,在下一个窗口的开始也有大量请求,例如QPS为10,第一个窗口1s的后500ms突然有9个请求,而接下来计数器清空,在下一个窗口的前500ms突然也有9个请求,那这样两个500ms也是1s,而这个1s的窗口里就超出了QPS了

滑动窗口算法

在固定窗口的基础上改进,比如500ms滑动一次窗口,只要滑动的间隔越短,临界突变问题发生的概率也就越小,不过只要有窗口的存在就仍然有可能发生该问题

滑动日志算法

逻辑就是记录下每个请求的时间点,如何新请求到达时去判断时间范围内的请求数量是否超过指定阈值,这样就没有时间窗口的问题了,不过每次都需要去记录请求的时间点,需要占用较大内存

漏通算法

请求看为生产者,每个请求如同一滴水,放到一个队列(漏桶)中,而桶底有一个孔,不断漏出水滴,消费的速率等于限流阈值,例如QPS为2,则效率速率为1s/2=500ms,当请求堆积超出指定容量会触发决绝策略
缺点就是因为消费速率固定,那如果漏桶接近满的时候,无法一次性处理多个请求,只能按照QPS速率处理

令牌桶算法

系统服务作为生产者,按照指定频率向桶中添加令牌,如QPS为2,每500ms向桶里添加一个令牌,如果桶中令牌数量达到阈值,则不再添加

而请求执行为消费者,每个请求都需要拿一个令牌,如果没拿到则触发拒绝策略

这些算法理解起来是很容易的,但是具体实现可能会比较复杂一点

本文作者:Malyue

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!