实现方式
令牌桶算法中,系统以固定的速率生成令牌并放入桶中。桶有固定的容量,当桶满时,新生成的令牌会被丢弃。每个请求在通过限流时,需要从桶中获取一个令牌。如果桶中有足够的令牌,请求可以通过;若桶中没有令牌,则请求被拒绝。例如,令牌生成速率为每秒 10 个,桶的容量为 100 个。系统会每秒向桶中添加 10 个令牌,当请求到来时,尝试从桶中取一个令牌,若桶中有令牌则请求通过,若桶为空则请求被限流。
优点
允许一定程度的突发流量:因为桶可以预先积累一定数量的令牌,所以在短时间内,系统能够处理比平均速率更高的流量,适应业务中偶尔出现的突发请求场景。
限流规则灵活:通过调整令牌生成速率和桶的容量,可以轻松实现不同的限流策略,满足多样化的业务需求。
缺点
实现相对复杂:需要设计令牌生成、存储以及获取的机制,涉及到定时任务、数据结构等知识,开发难度较固定窗口有所提升。
对令牌生成速率的设置要求较高:若令牌生成速率设置不合理,可能导致系统在高并发下无法有效限流或者资源利用不充分。