chenyahui / chenyahui.github.io

My blog
http://www.cyhone.com
0 stars 2 forks source link

Golang 限流器 time/rate 实现剖析 | 编程沉思录 #35

Open chenyahui opened 4 years ago

chenyahui commented 4 years ago

https://www.cyhone.com/articles/analisys-of-golang-rate/

限流器是微服务中必不缺少的一环,可以起到保护下游服务,防止服务过载等作用。上一篇文章 《Golang 限流器 time/rate 使用介绍》 简单介绍了 time/rate 的使用方法,本文则着重分析下其实现原理。建议在正式阅读本文之前,先阅读下上一篇文章。 上一篇文章讲到,time/rate 是基于 Token Bucket(令牌桶) 算法实现的限流。本文将会基于源码,深入剖析下 Golang

xlemon96 commented 4 years ago

你好,我想咨询一下,为什么限流器是先获取时间,再抢锁,强锁之后再获取时间不是更简单一些吗

chenyahui commented 4 years ago

@naivelife 你好,我想咨询一下,为什么限流器是先获取时间,再抢锁,强锁之后再获取时间不是更简单一些吗

可以降低一些锁粒度

xlemon96 commented 4 years ago

@chenyahui

@naivelife 你好,我想咨询一下,为什么限流器是先获取时间,再抢锁,强锁之后再获取时间不是更简单一些吗

可以降低一些锁粒度

但是reserveN函数在Reservation的ok为false时候还更新了last,这个时候reserveN应该没有进行桶变更,为什么还是要变更last

johnsGuo commented 2 years ago

大佬,你好,我想咨询一下go官方为啥使用float64来定义tokens呢?为啥不用int64呢?

chenyahui commented 2 years ago

@GuoGuiRong 大佬,你好,我想咨询一下go官方为啥使用float64来定义tokens呢?为啥不用int64呢?

因为固定生成的token有可能是小数,例如要求每3秒产生一个token,那10秒过去后,token数应该为3.33...

xuanskyer commented 2 years ago

“其中:r.limit.tokensFromDuration(r.lim.lastEvent.Sub(r.timeToAct)) 指的是,从该次消费到当前时间,一共又新消费了多少 Token 数目。

根据代码来看,要归还的 Token 要是该次消费的 Token 减去新消费的 Token。 不过这里我还没有想明白,为什么归还的时候,要减去新消费数目。”

个人理解:这个应该也是为了避免可用token超过最大值,长时间下去会导致 桶的最大值的 “溢出”问题 ,类似于内存泄漏