博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
限流算法之漏桶算法、令牌桶算法
阅读量:6823 次
发布时间:2019-06-26

本文共 880 字,大约阅读时间需要 2 分钟。

限流

每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性。即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统瘫痪。

通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务,或者引流。

如果要准确的控制QPS,简单的做法是维护一个单位时间内的Counter,如判断单位时间已经过去,则将Counter重置零。此做法被认为没有很好的处理单位时间的边界,比如在前一秒的最后一毫秒里和下一秒的第一毫秒都触发了最大的请求数,将目光移动一下,就看到在两毫秒内发生了两倍的QPS。

图片描述

限流算法

常用的更平滑的限流算法有两种:漏桶算法和令牌桶算法。

漏桶算法

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

图片描述

可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)。

因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发(burst)到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。

令牌桶算法

令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解。

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

图片描述

令牌桶的另外一个好处是可以方便的改变速度。一旦需要提高速率,则按需提高放入桶中的令牌的速率。一般会定时(比如100毫秒)往桶中增加一定数量的令牌,有些变种算法则实时的计算应该增加的令牌的数量。

图片描述

转载地址:http://uzlzl.baihongyu.com/

你可能感兴趣的文章
将屏幕的全部输出存到文件 转
查看>>
postgresql学习笔记(五)备份与恢复
查看>>
从SCCM中创建并运行Powershell脚本卸载软件
查看>>
【java解惑】java字符串替换方法使用
查看>>
条件查询detachedCriteria的使用
查看>>
2012年第二届中国海宁长三角科技博览会(转)
查看>>
Mongodb 分片 手动维护chunk
查看>>
【C#|.NET】lock(this)其实是个坑
查看>>
我的友情链接
查看>>
最大连续和 Medium
查看>>
1030.在线视频—开源网管Cacti系列讲座(五)Cacti插件架构与插件安装
查看>>
Linux中exec命令相关
查看>>
asp.net mvc 如何调用微信jssdk接口:分享到微信朋友(圈)| 分享到qq空间
查看>>
Redis主从配置
查看>>
全面掌握ping命令(四)ping命令常用参数
查看>>
【C语言】编写一个程序统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数。...
查看>>
mysql用户管理、常用sql语句、mysql数据库备份恢复
查看>>
五大常用算法
查看>>
说说这些年做的云计算和大数据项目
查看>>
java基础第十二天_集合
查看>>