分布式系统设计之限流算法剖析:漏桶与令牌桶

bugouhen
发布于 2020-9-25 10:38
浏览
0收藏

前言


限流机制主要用于对流入系统的请求流量进行限制,保证在任何时候进入系统的请求流 量都是可控的。即不能超过系统预设的最大流量值,超过则需要排队等待或者直接拒绝,从 而避免高并发流量全部涌入系统,导致超出了系统的处理能力而出现系统机器宕机和服务不 可用问题。

 

限流机制在实现层面,一般是基于漏桶算法或令牌桶算法来实现的,如下对这两种算法进行具体分析。

 

漏桶算法

 

对于漏桶算法,首先可以抽象为在业务服务前面,放置了一个漏桶来接收请求流量,然 后在漏桶中开一个指定大小的口来将这些请求流量流出给业务服务处理。由于漏桶的口是固 定的,故交给业务服务处理的请求流量也是固定的,而不会受到流入漏桶的请求流量的大小 的影响。如图所示:分布式系统设计之限流算法剖析:漏桶与令牌桶-鸿蒙开发者社区

 

即如果请求流量较小,则可以直接通过该漏桶的口流出给业务服务处理;如果请求 流量过大,该口无法及时流出个业务服务处理,则首先会在漏桶中累计。在实际实现当中可 以使用有界队列来实现请求的累计,如果请求流量占满了漏桶空间,则后续请求会溢出,即 请求被直接拒绝。

 

所以通过漏桶交给业务服务处理的请求流量是可控的,以及根据漏桶口的大小以恒定速 率流出请求流程给业务服务处理,不会受到突发流量的影响,从而避免了突发的、超过服务 处理能力的高并发请求流量压垮业务服务。

 

令牌桶算法

 

与漏桶算法将请求流入到漏桶,然后由漏桶流出给业务服务处理不同,在令牌桶算法中, 每个请求在交给业务服务处理之前,都需要首先从令牌桶获取一个令牌,如果获取成功则可 以交给对应的业务服务处理,如果获取失败则需要等待或者直接拒绝。如图所示:

分布式系统设计之限流算法剖析:漏桶与令牌桶-鸿蒙开发者社区

 

令牌桶中的令牌是业务服务根据自身处理能力来以恒定的速率添加到令牌桶的,如 200r/s,每秒 200 个,则业务服务每秒最多可以处理 200 个请求,超过的请求则需要阻塞等 待或者被拒绝。而每秒添加令牌可以一次性添加,也可以分多次添加,不过一般是分多次添 加,如 200r/s 可以是是每 500 毫秒添加 100 个。

 

除此之外,如果每秒的请求个数达不到每秒投放到令牌桶的令牌的个数,如实际请求为 每秒 100 个,而业务服务投放令牌到令牌桶为每秒 200 个,故此时的请求流量低于业务服务 的指定速率。所以多余的令牌会在令牌桶累计,直到到达该桶的大小,如令牌桶可以最多存 放 500 个,超过的令牌则直接丢弃。其中令牌桶的大小也是按照业务服务的最大处理能力来 设定的,如业务服务每秒处理 200 个性能是最好的,但是也可以接收 500 个请求的突发流量。

 

由于业务服务会继续以指定速率添加令牌,故如果实际的请求达到的速率一直达不到令牌投放的速率,则一段时间后令牌桶会保持有 500 个令牌。如果之后某段时间突然有 500 个请求过来,则这 500 个请求可以交给业务服务处理。

 

总结

 

所以与漏桶算法相比,令牌桶算法除了支持对请求流量进行控制,使得请求流量以指定 速率交给业务服务处理之外,还支持处理异常突发流量,从而实现对业务服务最大处理能力 的利用。

 

 

作者:服务端开发

分类
已于2020-9-25 16:16:28修改
收藏
回复
举报
回复
    相关推荐