0%

限流算法

限流简介

在不同场景下限流的定义也各不相同,可以是每秒请求数、每秒事务处理数、网络流量。

通常我们所说的限流指的是限制到达系统并发请求数,使得系统能够正常的处理部分用户的请求,来保证系统的稳定性。

为什么限流

接口无法控制调用方的行为。热点业务突发请求、恶意请求攻击等会带来瞬时的请求量激增,导致服务占用大量的CPU、内存等资源,使得其他正常的请求变慢或超时,甚至引起服务器宕机。

按照请求次数进行收费的接口需要根据客户支付的金额来限制客户可用的次数。

限流的行为

限流的行为指的就是在接口的请求数达到限流的条件时要触发的操作,一般可进行以下行为。

  • 拒绝服务:把多出来的请求拒绝掉
  • 服务降级:关闭或是把后端服务做降级处理,这样可以让服务有足够的资源来处理更多的请求
  • 特权请求:资源不够了,我只能把有限的资源分给重要的用户
  • 延时处理:一般会有一个队列来缓冲大量的请求,这个队列如果满了,那么就只能拒绝用户了,如果这个队列中的任务超时了,也要返回系统繁忙的错误了
  • 弹性伸缩:用自动化运维的方式对相应的服务做自动化的伸缩

限流算法

固定窗口计数器

将时间按照设定的周期划分为多个窗口在当前时间窗口内每来一次请求就将计数器加一如果计数器超过了限制数量,则拒绝服务当时间到达下一个窗口时,计数器的值重置。

滑动窗口计数器

将设定的时间周期设为滑动窗口的大小,记录每次请求的时刻当有新的请求到来时将窗口滑到该请求来临的时刻判断窗口内的请求数是否超过了限制,超过限制则拒绝服务,否则请求通过丢弃滑动窗口以外的请求。

漏桶算法

将进来的请求流量视为水滴先放入桶内水从桶的底部以固定的速率匀速流出,相当于在匀速处理请求当漏桶内的水满时(超过了限流阈值)则拒绝服务。

令牌桶算法

按照一定的速率生产令牌并放入令牌桶中如果桶中令牌已满,则丢弃令牌请求过来时先到桶中拿令牌,拿到令牌则放行通过,否则拒绝请求。

这种算法能够把请求均匀的分配在时间区间内,又能接受服务可承受范围内的突发请求。所以令牌桶算法在业内使用也非常广泛。