使用 Golang 实现简易的令牌桶算法
文章目录
- 简介
- 实现
- 轮子
简介
在网络中传输数据的时候时,为了防止网络拥塞,需限制流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。
令牌桶算法是网络流量整形和速率限制中最常使用的一种算法。大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。
传送到令牌桶的数据包需要消耗令牌。不同大小的数据包,消耗的令牌数量不一样。
令牌桶这种控制机制基于令牌桶中是否存在令牌来指示什么时候可以发送流量。令牌桶中的每一个令牌都代表一个字节。如果令牌桶中存在令牌,则允许发送流量;而如果令牌桶中不存在令牌,则不允许发送流量。因此,如果突发门限被合理地配置并且令牌桶中有足够的令牌,那么流量就可以以峰值速率发送。
与“令牌桶算法”类似的算法还有“漏桶算法”,这两种算法的主要区别在于“漏桶算法”能够强行限制数据的传输速率,而“令牌桶算法”在能够限制数据的平均传输速率外,还允许某种程度的突发传输。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允许突发地传输数据直到达到用户配置的门限,因此它适合于具有突发特性的流量。
在本文中,我们使用 Golong 语言实现一个简单的“令牌桶算法”,或者说是“漏桶算法”更为合适。
实现
首先,我们假设令牌桶的放入令牌的速率是恒定的,不考虑流量速率突变的情况。
package awesomeProjectimport ("sync""time"
)// 定义令牌桶结构
type tokenBucket struct {limitRate int // 限制频率,即每分钟加入多少个令牌tokenChan chan struct{} // 令牌通道,可以理解为桶cap int // 令牌桶的容量muLock *sync.Mutex // 令牌桶锁,保证线程安全stop bool // 停止标记,结束令牌桶
}// NewTokenBucket 创建令牌桶
func NewTokenBucket(limitRate, cap int) *tokenBucket {if cap < 1 {panic("token bucket cap must be large 1")}return &tokenBucket{tokenChan: make(chan struct{}, cap),limitRate: limitRate,muLock: new(sync.Mutex),cap: cap,}
}// Start 开启令牌桶
func (b *tokenBucket) Start() {go b.produce()
}// 生产令牌
func (b *tokenBucket) produce() {for {b.muLock.Lock()if b.stop {close(b.tokenChan)b.muLock.Unlock()return}b.tokenChan <- struct{}{}d := time.Minute / time.Duration(b.limitRate)b.muLock.Unlock()time.Sleep(d)}
}// Consume 消费令牌
func (b *tokenBucket) Consume() {<-b.tokenChan
}// Stop 停止令牌桶
func (b *tokenBucket) Stop() {b.muLock.Lock()defer b.muLock.Unlock()b.stop = true
}
其中,
tokenBucket
为令牌桶的结构,包括限制频率、令牌桶容量和通道等;NewTokenBucket
为对外提供的创建令牌桶的方法;Start
为开启令牌桶的方法;produce
为以恒定速率生成令牌的方法,以协程的方式启动;Consume
为消费令牌的方法;Stop
为停止令牌桶的方法。
如上述所示,即为令牌桶的简易实现。
轮子
实际上,在 Go 语言中已经提供了对令牌桶的支持了,因此不需要我们重复造轮子。
更详细的内容,大家可以点击「limiter」进行查看,祝好!
参考资料:
- 令牌桶算法
- 漏铜算法
- 令牌桶工作原理
- 微服务-限流
- golang.org/x/time rate
使用 Golang 实现简易的令牌桶算法相关推荐
- 接口限流算法:漏桶算法令牌桶算法
工作中对外提供的API 接口设计都要考虑限流,如果不考虑限流,会成系统的连锁反应,轻者响应缓慢,重者系统宕机,整个业务线崩溃,如何应对这种情况呢,我们可以对请求进行引流或者直接拒绝等操作,保持系统的可 ...
- 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...
作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...
- 限流算法之漏桶算法、令牌桶算法
限流 每个API接口都是有访问上限的,当访问频率或者并发量超过其承受范围时候,我们就必须考虑限流来保证接口的可用性或者降级可用性.即接口也需要安装上保险丝,以防止非预期的请求对系统压力过大而引起的系统 ...
- 令牌桶算法和漏桶算法有什么区别_高并发之限流,到底限的什么鬼 (精品长文)...
你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供了一个限流实现: RateLimi ...
- 限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:雄 ...
- redis实现令牌桶算法思路
1.常用的限流思路令牌桶算法和漏桶算法 直接令牌桶算法代码 <?phpclass TokenBucket{private $_config; //redis设定private $_redis; ...
- 高可用系统设计 | 分布式限流策略:计数器算法、漏桶算法、令牌桶算法
文章目录 限流 什么是限流? 分布式限流 限流算法 计数器算法 固定窗口计数器 滑动窗口计数器 漏桶算法 令牌桶算法 限流 什么是限流? 限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已 ...
- c++ lua 可以做什么_Redis令牌桶算法(全网最全,后续可以接入lua做原子性操作)...
一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...
- Web API 速率限制(二)- 令牌桶算法简介
前情提要 上一篇文章里简单介绍了什么是Web API的速率限制,和限速策略需考虑的问题,最后还介绍了ASP.NET Core 的一个常用限速库.......的名字. 实施策略 如果你想要建立一个限速系 ...
- 接口限流算法:漏桶算法amp;令牌桶算法
转载自 接口限流算法:漏桶算法&令牌桶算法 背景 每一个对外提供的API接口都是需要做流量控制的,不然会导致系统直接崩溃.很简单的例子,和保险丝的原理一样,如果用电符合超载就会烧断保险丝断掉电 ...
最新文章
- BZOJ3488 : [ONTAK2010]Highways
- ashx 跨域_ASP.NET通用HTTP处理程序(ashx的),支持JSONP
- php长传文件到数据库,php上传文件并存储到mysql数据库的简单示例
- 使用JavaFX AnimationTimer
- LeetCode-697. 数组的度
- 成立烘焙公司、买茶饮 瑞幸咖啡谋变破局
- 一文带你了解 JVM 的垃圾回收机制
- ndarray、array、asarray的区别以及查看变量地址、is和==的区别
- struts2从form取值的三种方式
- linux新建mysql用户命令_使用MySQL命令行新建用户并授予权限
- iOS ipa包进行重新签名
- 5、最长回文子串(python)
- 常用Gis通用符号库大全
- chardet demo
- 汇编语言学习:如何理解“物理地址=段地址X16+偏移地址”
- —— GPS测量原理及应用复习-3 ——
- 1000款水墨墨迹毛笔素材
- java 吸血鬼数字(四位数)
- java mye,JAVA-MyEclipse第一个实例
- 可视化入门:从 0 到 1 开发一个图表库
热门文章
- matlab匿名函数求导,MATLAB进行匿名函数求导出现错误
- 通过ssh远程连接Ubuntu主机
- CMDN创新应用推荐:搜狗号码通
- ios html跳转appstore,H5跳转app store问题
- 达摩达兰论估价pdf_应用公司理财PDF下载_(美)阿斯瓦斯・达摩达兰_机械工业出版社_会计_管理_零度图书网...
- h3csyslog_H3C-syslog配置命令
- VS2017创建项目模板和项模板(方便实用)
- 【Chatbot】2:中文聊天机器人的实现
- pdf阅读器怎么样去拆分文档啊
- c语言小球消砖块增加一行砖块,基于Unity的小球撞击砖块小游戏