Web开发来一发(十三)限流

1、限流算法简介

每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。

限流的算法是参考水流建立模型的,常用限流算法有两种:漏桶算法和令牌桶算法。

漏桶算法

水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求。可以看出漏桶算法能强行限制数据的传输速率。

因为漏桶的漏出速率(这个是系统处理能力决定的)是固定的参数,所以漏桶算法对于存在突发特性的流量来说缺乏效率。

令牌桶算法

随着时间流逝,系统会按恒定1/QPS时间间隔往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。

令牌桶算法可以方便地改变速率,一旦需要提高速率,则按需提高放入桶中的令牌的速率。

2、RateLimiter简介

Google开源工具包Guava提供了限流工具类RateLimiter,该类基于令牌桶算法来完成限流。其基本思路是:通过限制请求流入的速度,即通过设定加入令牌的速率来控制请求的处理。实现原理如下:

1)内部维护一个秒表,秒表记录上一次请求的时间,新请求到来时,比较这个时间差和1/QPS,如果这个时间差比1/QPS要短,那么就不接收这个请求。有阻塞和非阻塞两种方式,请求方来选择是否立即返回。

2)RateLimiter只记录上一个请求到来的时间,如果中间很长时间都没有请求,说明利用不充分。这时候会有storedPemits记录未被利用的令牌数。当storedPemits越大,那么接下来接收请求的能力就越强。

3)如果有昂贵的请求到来,也可以立即执行,但接下来的请求必须等到正确的时间才能继续执行。

 

参考资料:

https://blog.csdn.net/tianyaleixiaowu/article/details/74942405

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值