SpringBoot进阶教程(六十七)RateLimiter限流

限流背景
在早期的计算机领域,限流技术(time limiting)被用作控制网络接口收发通信数据的速率。 可以用来优化性能,减少延迟和提高带宽等。 现在在互联网领域,也借鉴了这个概念, 用来为服务控制请求的速率, 如果双十一的限流, 12306的抢票等。 即使在细粒度的软件架构中,也有类似的概念。

系统使用下游资源时,需要考虑下游对资源受限、处理能力,在下游资源无法或者短时间内无法提升处理性能的情况下,可以使用限流器或者类似保护机制,避免下游服务崩溃造成整体服务的不可用。

回到顶部
v限流算法
常见限流算法有两种:漏桶算法和令牌桶算法。

2.1 漏桶算法

漏桶算法(Leaky Bucket)是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经常使用的一种算法,它的主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 在网络中,漏桶算法可以控制端口的流量输出速率,平滑网络上的突发流量,实现流量整形,从而为网络提供一个稳定的流量。

如下图所示,把请求比作是水,水来了都先放进桶里,并以限定的速度出水,当水来得过猛而出水不够快时就会导致水直接溢出,即拒绝服务。

SpringBoot进阶教程(六十七)RateLimiter限流

图片来源于网络,侵删。

可以看出,漏桶算法可以很好的控制流量的访问速度,一旦超过该速度就拒绝服务。

2.2 令牌桶算法

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。从原理上看,令牌桶算法和漏桶算法是相反的,一个“进水”,一个是“漏水”。

对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。

如下图所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

SpringBoot进阶教程(六十七)RateLimiter限流

图片来源于网络,侵删。

本文后面实例中讲到的RateLimiter(Google的Guava包)正是使用的令牌桶算法。

2.3 漏桶算法和令牌桶算法的区别

漏桶算法的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。漏桶算法通常可以用于限制访问外部接口的流量,保护其他人系统,比如我们请求银行接口,通常要限制并发数。

令牌桶算法生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,可以处理瞬时流量,而且拿令牌的过程并不是消耗很大的事情。令牌桶算法通常可以用于限制被访问的流量,保护自身系统。

需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。
https://github.com/users/zenglvnieki2/projects/979
https://github.com/users/hhcarm7521/projects/977
https://github.com/users/zenglvnieki2/projects/980
https://github.com/users/zenglvnieki2/projects/981
https://github.com/users/hhcarm7521/projects/978
https://github.com/users/zenglvnieki2/projects/982
https://github.com/users/hhcarm7521/projects/979
https://github.com/users/zenglvnieki2/projects/983
https://github.com/users/hhcarm7521/projects/980
https://github.com/users/zenglvnieki2/projects/984
https://github.com/users/hhcarm7521/projects/981
https://github.com/users/zenglvnieki2/projects/985
https://github.com/users/hhcarm7521/projects/982
https://github.com/users/zenglvnieki2/projects/986
https://github.com/users/hhcarm7521/projects/983
https://github.com/users/zenglvnieki2/projects/987
https://github.com/users/hhcarm7521/projects/984
https://github.com/users/zenglvnieki2/projects/988
https://github.com/users/hhcarm7521/projects/985
https://github.com/users/zenglvnieki2/projects/989
https://github.com/users/zenglvnieki2/projects/990
https://github.com/users/hhcarm7521/projects/986
https://github.com/users/hhcarm7521/projects/987
https://github.com/users/zenglvnieki2/projects/991
https://github.com/users/hhcarm7521/projects/988
https://github.com/users/zenglvnieki2/projects/992
https://github.com/users/hhcarm7521/projects/989
https://github.com/users/zenglvnieki2/projects/993
https://github.com/users/hhcarm7521/projects/990
https://github.com/users/zenglvnieki2/projects/994
https://github.com/users/hhcarm7521/projects/991
https://github.com/users/zenglvnieki2/projects/995
https://github.com/users/hhcarm7521/projects/992
https://github.com/users/zenglvnieki2/projects/996
https://github.com/users/zenglvnieki2/projects/997
https://github.com/users/hhcarm7521/projects/993
https://github.com/users/zenglvnieki2/projects/998
https://github.com/users/hhcarm7521/projects/994
https://github.com/users/zenglvnieki2/projects/999
https://github.com/users/hhcarm7521/projects/995
https://github.com/users/zenglvnieki2/projects/1000
https://github.com/users/hhcarm7521/projects/996
https://github.com/users/hhcarm7521/projects/997
https://github.com/users/zenglvnieki2/projects/1001
https://github.com/users/hhcarm7521/projects/998
https://github.com/users/zenglvnieki2/projects/1002
https://github.com/users/hhcarm7521/projects/999
https://github.com/users/hhcarm7521/projects/1000
https://github.com/users/zenglvnieki2/projects/1003
htt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值