网络下载限流,令牌桶算法

什么是限流

一个典型的例子是,当我们在使用百度网盘下载某个文件,在没有开通VIP的情况下,下载速度只有几百K甚至几十K每秒;而我们的网速现在大多数都是10~100M,下载速度和网络出现很大的差距。在开通VIP后下载,速度就会飙升到几M每秒,像这种情况,一般都是软件的客户端或者服务端使用了限流,不花钱就让你慢慢等待。

如何在我们的软件中做限流

令牌桶算法

先上代码,实现一个简易的令牌桶限流器。

核心思想

令牌桶的思想很简单,(1)实现一个固定大小的令牌桶,按照固定的速率往桶中装入令牌,(2)每次进行流量操作(例如,下载文件)都会消耗桶中令牌,(3)当桶中令牌不足时则操作需要等待;

通过函数set_rate可以设置桶中令牌生成的平均速率;成员变量m_build_interval_ms即为每生成一个令牌需要多少时间,单位为毫秒;

从函数resync和函数claim_next中可以看出,令牌桶算法在一定程度上是能够应对突发流量,比如说,1s中生成的令牌数是1000个,而在第一秒只是用了800个令牌,那么在第2s后可使用的令牌数将为1200个。当然对于突发流量也是有上限支持的,最大为桶的大小。

acquire是限流中的核心函数,在每次进行流量操作后,需要使用acquire来决定是否需要等待,如下:

图解流程

网络下载限流,令牌桶算法

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览33996 人正在系统学习中

来源:抱猫人

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月10日
下一篇 2022年3月10日

相关推荐