基于漏桶(Leaky bucket)与令牌桶(Token bucket)算法的流量控制
这篇讲的是高并发系统限流中的两个经典算法——漏桶与令牌桶的核心差异和适用场景。文章以大促流量为背景,引出限流对系统稳定性的必要性。 漏桶算法被形象地比喻为一个底部有孔的桶,它强制数据以固定速率流出,哪怕输入流量是突发的,它也能起到削峰填谷、强行平滑流量的作用。 而令牌桶则不同,它以固定速率向桶中放置令牌,请求需要消耗令牌才能通过。文章特别指出,令牌桶允许桶内积累一定数量的令牌,因此能较好地应对突发流量,在平均限流的同时保留了灵活性。文中也提到了Guava的RateLimiter,其SmoothBursty实现正是令牌桶的优化,能积攒令牌应对短时高峰,而SmoothWarmingUp则实现了漏桶式的预热限流。 作者通过对比明确了二者的本质区别:漏桶强在“恒定速率”,令牌桶强在“允许突发”。选择哪种算法,关键取决于你的业务流量是需要严格平滑,还是需要在平均速率约束下应对可预测的突发。