知识卡片
令牌桶算法允许突发不允许持续超额
内容
令牌桶是[[三种限流场景对应三种模式]]里服务端限流最常见的具体实现算法,给每个用户配一个桶,令牌按固定速率(补充速率)持续滴进桶里,桶有个上限(突发容量);每来一个请求就从桶里扣一个令牌,桶空了新请求就被拒绝。这个设计的巧妙之处在于两个参数分工不同:补充速率决定了长期能承受的平均请求速率,突发容量决定了短时间内允许超过平均速率多少。比如补充速率每秒 10 个、突发容量 20 个,意味着平时稳定在每秒 10 个请求没问题,突然来一波流量尖峰时最多能扛住 20 个,但因为令牌消耗完之后要重新按补充速率攒,如果尖峰接二连三地来,只有第一波能扛住,后面几波会因为桶里没令牌而被拒绝。发散:这解释了为什么令牌桶比”每秒钟计数器归零”这种朴素限流思路更贴近真实流量——真实世界的请求很少是绝对均匀分布的,总会有短暂的抖动和尖峰,令牌桶用”允许攒一点余量应急,但长期总量不能超”的方式,在严格限流和适应流量抖动之间找了个平衡点。
参考来源
《Cloud Native Spring in Action》第9章《API gateway and circuit breakers》