常见限流策略

156 阅读2分钟

限流算法原理

令牌桶算法

image.png 原理:以固定速率定期产生令牌放到令牌桶中,当请求到达时,如果存在冗余的令牌则可以访问,否则直接拒绝连接。同时需要限制桶的大小,当产生的令牌超过上限时,则不继续生产令牌。

优点:实现简单且需要消耗的内存较小。同时能处理一定量的突然流量

缺点:比较难衡量令牌产生速度和总的令牌数量

适用场景

漏桶算法

image.png 原理:每次将新到达的请求放入一个队列,以恒定的速率消耗队列中的请求。同时队列有一个容量上限,当队列满时,新到达的请求会直接被丢弃。

优点:内存消耗较小

缺点:难以处理突发流量,且队列的容量和消耗速率比较难衡量

适用场景:金融等对消费速率稳定性要求较高的场景

固定窗口计数器算法

image.png 原理:将时间划分为一个个小的窗口,记录每个时间窗口内的请求数量,当请求数量达到窗口阈值时,则直接丢弃该请求

优点:实现简单,易于理解,同时内存消耗较少

缺点:在窗口边缘可能会导致双倍的请求。

滑动日志

image.png

原理:类似于固定窗口计数器,限制每个时间窗口的请求数量,不同的是当每个请求到达时,会将请求时间戳记录在日志中,同时以当前时间倒退一个时间窗口,计算该窗口内部请求数量是否达到阈值,达到阈值则丢弃请求

优点:对于限速上限限制的比较严格

缺点:需要记录请求的时间戳,内存消耗较大

滑动窗口

image.png

原理:将总的请求阈值设置为上一个窗口和当前窗口请求的加权平均,以此判断新的请求是否会被丢弃。

优点:内存消耗较少,请求限制的额比较平滑,没有突增或者突减的情况。

缺点:它仅适用于不太严格的回溯窗口。由于它假设前一个窗口中的请求是均匀分布的,因此它只是对实际速率的近似。