限流算法原理
令牌桶算法
原理:以固定速率定期产生令牌放到令牌桶中,当请求到达时,如果存在冗余的令牌则可以访问,否则直接拒绝连接。同时需要限制桶的大小,当产生的令牌超过上限时,则不继续生产令牌。
优点:实现简单且需要消耗的内存较小。同时能处理一定量的突然流量
缺点:比较难衡量令牌产生速度和总的令牌数量
适用场景
漏桶算法
原理:每次将新到达的请求放入一个队列,以恒定的速率消耗队列中的请求。同时队列有一个容量上限,当队列满时,新到达的请求会直接被丢弃。
优点:内存消耗较小
缺点:难以处理突发流量,且队列的容量和消耗速率比较难衡量
适用场景:金融等对消费速率稳定性要求较高的场景
固定窗口计数器算法
原理:将时间划分为一个个小的窗口,记录每个时间窗口内的请求数量,当请求数量达到窗口阈值时,则直接丢弃该请求
优点:实现简单,易于理解,同时内存消耗较少
缺点:在窗口边缘可能会导致双倍的请求。
滑动日志
原理:类似于固定窗口计数器,限制每个时间窗口的请求数量,不同的是当每个请求到达时,会将请求时间戳记录在日志中,同时以当前时间倒退一个时间窗口,计算该窗口内部请求数量是否达到阈值,达到阈值则丢弃请求
优点:对于限速上限限制的比较严格
缺点:需要记录请求的时间戳,内存消耗较大
滑动窗口
原理:将总的请求阈值设置为上一个窗口和当前窗口请求的加权平均,以此判断新的请求是否会被丢弃。
优点:内存消耗较少,请求限制的额比较平滑,没有突增或者突减的情况。
缺点:它仅适用于不太严格的回溯窗口。由于它假设前一个窗口中的请求是均匀分布的,因此它只是对实际速率的近似。