限流器:令牌桶和漏桶
本周为了Taf框架引入了限流器算法,用于Trace上报时进行限流
早在写go的时候就使用过著名的golang.org/x/time/rate限流器,这是一个令牌桶算法,它允许在保证平均rate的情况下,有一些突发流量
还用过uber开源的github.com/uber-go/ratelimit限流器,这是一个漏桶算法,它能严格的控制每个请求的最小访问间隔,并允许配置一个最大松弛量(maxSlack)用于最大间隔误差
简单介绍下两种算法的大概实现和区别,随后分别深入两种算法的实现
令牌桶算法
由一个令牌桶和生成令牌的间隔时间组成。一开始,令牌桶被填满,然后以固定的速率生成新的令牌,直到桶满为止。当请求进入系统时,需要从桶中删除一个令牌。如果桶是空的(没有令牌可以删除),请求则会被拒绝或等待。
漏桶算法
模拟了一个漏水的桶。进入系统的数据被放入桶中,然后以固定的速率流出。如果桶已满,新到的数据则被丢弃或等待。由于输出的数据流是恒定的,因此可以用于控制数据的整体速率。