知识卡片

漏桶与令牌桶方向相反的流量整形算法及令牌桶更受青睐的原因

结构图卡

内容

[[流量计数器的离散统计缺陷与滑动时间窗的平滑解法]]只能否决式限流,要支持 阻塞式限流(让超额请求排队而非直接拒绝)、平滑处理流量突变(流量整形, Traffic Shaping),需要用到缓冲区。漏桶算法:请求像水一样流进一个固定 大小的桶,桶以恒定速率往外”放水”(放行请求进入系统),注水速度超过出水 速度时桶被灌满,多余请求(水)溢出被拒绝——本质是从”桶”往系统单向放行, 出水速率是固定值,适合处理速度稳定不变的拓扑结构,但现实系统的处理 能力常受内部拓扑变化和自动伸缩影响,固定速率不够灵活。令牌桶算法方向 正好相反:系统按固定速率往桶里”发”令牌,请求进来时要先从桶里取到一个 令牌才能被处理,取不到就失败或降级;桶同样有最大容量,闲时攒下的令牌 构成请求的最大缓冲余量。这个”方向反转”带来的灵活性是:令牌桶天然支持 动态调整发放速率(对应系统实时处理能力的变化),而漏桶的出水速率通常 是写死的常量——这正是令牌桶在现实系统中更受青睐的原因。实现上令牌桶 也比听起来简单:不需要专用线程定时发令牌,只要给令牌加一个时间戳,取 令牌时用当前时间和时间戳一算就知道该补发多少个,一次性补发即可。

结构图

flowchart LR
    subgraph 漏桶
        A1[请求如水流入] --> A2[固定大小桶/缓冲区]
        A2 -->|固定速率放水| A3[进入系统处理]
        A2 -.桶满溢出.-> A4[请求被拒绝]
    end
    subgraph 令牌桶
        B1[系统按固定/可变速率发令牌] --> B2[桶存放令牌, 有最大容量]
        B3[请求到达] -->|先取1个令牌| B2
        B2 -->|取到令牌| B4[放行进入系统]
        B2 -.桶空取不到.-> B5[失败或降级]
    end

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第8章"流量治理"8.2.2节 "限流设计模式"(源文件:_epub-src对应OEBPS/Text/chapter102.xhtml) - 结论依据:原文分别说明漏桶"从水池向系统放水"、出水速率固定不适应 动态拓扑,令牌桶方向相反、支持动态速率因此更受程序员青睐,并说明 令牌桶可用时间戳补发而非专用定时器实现,直接支撑本卡片结构梳理。 - 原始内容:所谓漏桶……水池同时又以额定的速度出"水"……令牌桶就是你去 银行办事时摆在门口的那台排队机……只是方向刚好相反,漏桶是从水池里向 系统发送请求,令牌桶则是系统往排队机中放入令牌……能够支持变动请求 处理速率的令牌桶算法可能会更受程序员的青睐。