关于go语言实现的几种限流算法介绍

一、漏桶算法
算法思想
与令牌桶是“反向”的算法,当有请求到来时先放到木桶中,worker以固定的速度从木桶中取出请求进行相应。如果木桶已经满了,直接返回请求频率超限的错误码或者页面
适用场景
流量最均匀的限流方式,一般用于流量“整形”,例如保护数据库的限流。先把对数据库的访问加入到木桶中,worker再以db能够承受的qps从木桶中取出请求,去访问数据库。不太适合电商抢购和微博出现热点事件等场景的限流,一是应对突发流量不是很灵活,二是为每个user_id/ip维护一个队列(木桶),workder从这些队列中拉取任务,资源的消耗会比较大。
go语言实现
通常使用队列来实现,在go语言中可以通过buffered channel来快速实现,任务加入channel,开启一定数量的worker从channel中获取任务执行。
package mainimport ( fmt sync time)// 每个请求来了,把需要执行的业务逻辑封装成task,放入木桶,等待worker取出执行type task struct { handler func() result // worker从木桶中取出请求对象后要执行的业务逻辑函数 reschan chan result   // 等待worker执行并返回结果的channel taskid  int}// 封装业务逻辑的执行结果type result struct {}// 模拟业务逻辑的函数func handler() result { time.sleep(300 * time.millisecond) return result{}}func newtask(id int) task { return task{  handler: handler,  reschan: make(chan result),  taskid:  id, }}// 漏桶type leakybucket struct { bucketsize int       // 木桶的大小 numworker  int       // 同时从木桶中获取任务执行的worker数量 bucket     chan task // 存方任务的木桶}func newleakybucket(bucketsize int, numworker int) *leakybucket { return &leakybucket{  bucketsize: bucketsize,  numworker:  numworker,  bucket:     make(chan task, bucketsize), }}func (b *leakybucket) validate(task task) bool { // 如果木桶已经满了,返回false select { case b.bucket <- task: default:  fmt.printf(request[id=%d] is refused, task.taskid)  return false } // 等待worker执行 <-task.reschan fmt.printf(request[id=%d] is run, task.taskid) return true}func (b *leakybucket) start() { // 开启worker从木桶拉取任务执行 go func() {  for i := 0; i < b.numworker; i++ {   go func() {    for {     task := <-b.bucket     result := task.handler()     task.reschan <- result    }   }()  } }()}func main() { bucket := newleakybucket(10, 4) bucket.start() var wg sync.waitgroup for i := 0; i  100ms, 增加 (now - last) / 100ms个令牌。然后,如果令牌数 > 0,令牌数 -1 继续执行后续的业务逻辑,否则返回请求频率超限的错误码或页面。


采埃孚携手Aeva合作研发用于自动驾驶汽车的激光雷达传感器
2009-2012年中国电池隔膜行业市场调研及投资分析预测报
URP中的相机堆栈
小米5X、MIUI9、小米6亮银版已发布,小米Note3、小米6Plus、红米Pro2、红米Note5期待吗?
智慧医疗最基本的原则是什么
关于go语言实现的几种限流算法介绍
华捷艾米参加豪威科技大会 3D AI/MR解决方案共建产业生态
宝沃汽车的思路是新零售,为何不重品牌运营?
小米9王源定制版与透明尊享版曝光配置和价格完全相同
为电动自行车和电动摩托车提供续航时间更长的13S、48V锂离子电池组
研赛科技AFC系统批量采用芯动科技风华GPU,赋能轨道交通高质量运行
【数据库数据恢复】SQL SERVER数据库MDF(NDF)或LDF损坏怎么恢复数据?
如何区分按钮的短按与长按?
用这6种方式,CNC车间就能实现降本增效
一种高效率AC/DC电源的设计
AR会成为未来吗?AR眼镜能代替手机吗?
大金空调以技术推动空调界变革 做体验经济下的先驱者
检漏是检验高低温试验箱内是否稳定的关键步骤
二次供水设备远程监控解决方案
华为P系列,雪夜梅花开,似是故人来