0
点赞
收藏
分享

微信扫一扫

Java版本工程项目管理系统源码-全面的工程项目管理

北冥有一鲲 2023-05-10 阅读 53

固定窗口算法(Fixed Window Algorithm)

固定窗口算法原理是将时间划分为固定的窗口,统计每个窗口期间内的请求量,如果请求量超过阈值,则拒绝后续请求。

假如限流要求为每秒最多100个请求,以某次请求时间作为第一个窗口开始时间,使用一个计数器来表示请求数,接下来的每一个请求到来时:

  • 如果间隔时间大于一秒,请求通过,重置计数器,并将当前时间设为间隔开始时间;
  • 如果间隔时间小于一秒,计数器加一,如果计数器大于限制数时,请求拒绝,小于等于时,请求通过。

这种算法存在的问题是无法应对流量突增的情况。上面的例子如果第一个一秒的前900ms内没有访问量,后100ms内产生了100次访问量,第二个1s的前100ms产生了100 次访问量,这种情况下其实一秒的访问量达到了200,有可能会导致系统崩溃。

滑动窗口算法(Sliding Window Algorithm)

滑动窗口算法相对于固定窗口算法更加灵活,原理是将时间划分为固定大小的窗口,并在每个窗口内记录请求次数,在每个窗口往后滑动时,更新当前窗口的请求数,如果请求量超过阈值,则拒绝后续请求。

滑动窗口算法需要记录时间窗口内每个请求的达到时间点。假如限流要求为每秒最多100个请求,滑动窗口记录的时间点 list = (request1_time, request2_time …requestN_time),起点是list中最小的时间点request1_time,一个请求requestX过来时:

  • 到达时间requestX_time如果在request1_time + 1s内:判断list中的数量是否小于100,是的话,将requestX_time加入到list,请求通过;否的话,请求拒绝。
  • 到达时间requestX_time如果不在request1_time + 1s内,丢弃第一个时间点 request1_time,请求通过。

这种算法可以应对流量突增的情况,但对于请求频率过高的情况则存在浪费资源的问题。

漏斗算法(Leaky Bucket Algorithm)

实际上,当请求数超过阈值时,不希望后续流量被全部限流,而是希望将流量控制在一定速度内,这时候可以使用漏斗算法。其原理类似于水漏过漏斗的过程。漏斗算法将请求看作水滴,将水滴放入漏斗中,如果水滴太多,漏斗则会漏出一些水滴,以保证漏出速度不会超过预设的速率。具体实现是维护一个固定容量的漏斗,漏斗以一定的速度漏出水滴。当漏斗满了,新增请求将会被拒绝。

假如限流要求为每秒最多100个请求,那么设置桶的容量为100,一秒漏完,流速为100 request/s,每10毫秒处理一次请求。因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在漏斗里,如果漏斗满了,新进来的请求就被直接拒绝。

令牌桶算法(Token Bucket Algorithm)

令牌桶算法原理是维护一个存储固定数量令牌的桶,每当请求到来时,从桶中消耗一个令牌,当桶中没有令牌时,则拒绝请求。令牌的生成速率和桶的容量可以控制接口的访问速率。

假如限流要求为每秒最多100个请求,每秒最多取走100个token,桶的容量为100,令牌放入的速度为100/s。

从某种意义上讲,令牌桶算法是对漏斗算法的一种改进,漏斗桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用速率的同时还允许一定程度的突发调用。

举报

相关推荐

0 条评论