三.Go微服务--令牌桶实现原理 (3)

可以看到就是 1 有变化,从 1s -> 200ms 但是 2 一直都要等 1.2s

3.1 关于可能存在的bug restoreTokens := float64(r.tokens) - r.limit.tokensFromDuration(r.lim.lastEvent.Sub(r.timeToAct))

在取消的时候,会减掉一个预约的时间,但是我发现这里其实应该是重复减了一次

测试代码

func main() { t0 := time.Now() t1 := time.Now().Add(100 * time.Millisecond) t2 := time.Now().Add(200 * time.Millisecond) t3 := time.Now().Add(300 * time.Millisecond) l := rate.NewLimiter(10, 20) l.ReserveN(t0, 15) // 桶里还剩 5 个 token fmt.Printf("%+v\n", l) r := l.ReserveN(t1, 10) // 桶还有 -4 个, fmt.Printf("%+v\n", l) // 注释掉下面两行,最后结果还剩 8 个 token l.ReserveN(t2, 2) // 桶里还有 -5 个 fmt.Printf("%+v\n", l) r.CancelAt(t3) fmt.Printf("%+v\n", l) // 归还之前借的,运行结果 桶里还有 4 个 // 但是这里不应该剩下 6 个么,本来有 5 个,300ms 生成了 3 个,后面又预支出去 2 个 // 而且我发现如果我注释掉预支两个的代码,结果和我预期的一致,剩余 8 个token } 4. 总结

这一节主要是看了源码,但是其中还是有很多的细节没有深入的去了解,后面再去细看吧

5.参考

https://lailin.xyz/post/go-training-week6-3-token-bucket-2.html

https://pkg.go.dev/golang.org/x/time/rate

https://zhuanlan.zhihu.com/p/158948815

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgjgp.html