限流是高防CDN在应用层防护中最常用的手段之一。无论是对抗CC攻击、防止API滥用,还是保护源站不被突发流量压垮,限流都是第一道防线。但限流算法的选择直接影响两个关键指标:误封率和突发流量处理能力。算法选错了,要么正常用户的突发访问被误封,要么攻击流量漏过限流阈值。
本文拆解高防CDN中三种主流限流算法的原理差异,以及它们在不同场景下的组合使用逻辑。
一、令牌桶:允许突发,但限制长期速率
令牌桶算法的原理是:系统以固定速率向桶中放入令牌,桶有最大容量。每个请求需要消耗一个令牌才能被处理。如果桶中有令牌,请求立即被放行;如果桶空了,请求被拒绝或排队等待。
令牌桶的核心优势是允许突发流量。假设桶容量为100个令牌,填充速率为每秒10个。在空闲一段时间后,桶中积累了100个令牌,此时如果突然有100个请求同时到达,这100个请求可以立即被处理——因为桶中有足够的令牌。这就是令牌桶对突发流量的容忍能力。
令牌桶的参数配置需要平衡两个值。填充速率决定了长期的平均请求速率上限——如果填充速率是每秒10个,那么长期来看系统只能处理每秒10个请求。桶容量决定了突发的容忍程度——桶容量越大,允许的瞬时突发越高。对于API场景,桶容量通常设置为填充速率的5–10倍,以容忍客户端短时间内的批量调用。
二、漏桶:恒定速率,不允许突发
漏桶算法的原理是:请求先进入桶中排队,然后以恒定速率从桶中流出被处理。如果桶满了,新请求被拒绝。漏桶的流出速率是固定的,不随请求的到达速率变化。
漏桶的核心特征是平滑流量。无论请求到达的速率如何波动,流出的速率始终恒定。这对于保护源站非常有效——源站看到的请求速率是平稳的,不会因为客户端突发而承受瞬时压力。
但漏桶的缺点也很明显:它不允许任何突发。即使系统当前负载很低,如果请求到达速率超过了漏桶的流出速率,多余请求也会被排队或拒绝。对于有正常突发特征的业务(如移动端App在启动时批量拉取数据),漏桶可能误封正常请求。
三、滑动窗口:精确统计,但计算成本高
滑动窗口算法将时间划分为多个小窗口,统计每个窗口内的请求数。与固定窗口不同,滑动窗口的统计范围随时间滑动,避免了固定窗口在边界处的统计误差。
举例说明:固定窗口按每分钟统计,如果在第59秒发起100个请求,第61秒又发起100个请求,固定窗口会认为这是两个独立窗口,各自100个请求,都没超过阈值。但实际上在59秒到61秒的2秒内,有200个请求,瞬时速率极高。滑动窗口通过滑动统计范围,可以准确捕捉到这种边界突发。
滑动窗口的优点是统计精确,能够准确反映任意时间窗口内的请求数。缺点是计算成本高——需要维护每个请求的时间戳,并在每次判断时统计窗口内的请求数。对于高并发场景,滑动窗口的实现需要优化数据结构(如使用环形缓冲区),否则会成为性能瓶颈。
| 算法 | 突发容忍 | 统计精度 | 计算成本 | 适用场景 |
|---|---|---|---|---|
| 令牌桶 | 允许 | 中 | 低 | API调用、有正常突发的业务 |
| 漏桶 | 不允许 | 中 | 低 | 保护源站、对速率稳定性要求高 |
| 滑动窗口 | 精确控制 | 高 | 高 | CC防护、精确限流场景 |
四、组合使用:不同场景下的算法选择
实际的高防CDN限流策略通常不会只用一种算法,而是根据场景组合使用。
CC防护场景:通常使用滑动窗口做精确的请求频率统计,结合令牌桶做突发容忍。滑动窗口识别异常的请求频率模式,令牌桶允许正常用户的突发访问。这与高防CDN的CC防护与AI无感拦截中提到的行为分析是协同的——算法层做频率控制,行为分析层做意图识别。
API限流场景:通常使用令牌桶做客户端级别的限流。每个API Key有独立的令牌桶,桶容量和填充速率根据客户端的订阅等级配置。这样既保证了公平性(每个客户端有独立的配额),又容忍了正常突发。
源站保护场景:通常使用漏桶做回源速率控制。无论客户端请求如何波动,回源到源站的请求速率保持恒定,避免源站承受瞬时压力。
多层限流场景:在实际部署中,限流通常是多层的——边缘节点做第一层粗粒度限流(如单IP每秒请求数),清洗中心做第二层精细限流(如单API Key的令牌桶),源站做第三层兜底限流(如数据库连接数限制)。多层的目的是避免单点限流被绕过。
五、限流策略的评估要点
评估高防CDN的限流能力时,需要确认以下事项。第一,是否支持多种算法。 能否根据场景选择令牌桶、漏桶或滑动窗口。第二,限流维度是否丰富。 能否按IP、按API Key、按接口、按时间窗口多维限流。第三,阈值是否动态调整。 能否根据历史流量自动调整限流阈值,而不是静态配置。第四,是否有白名单机制。 内部调用、合作方调用能否豁免限流。第五,是否有监控和告警。 限流触发时能否及时告警,避免正常业务被误封而无人察觉。
限流策略的配置需要根据业务特征反复调优。阈值设置过松,攻击流量可能漏过;阈值设置过紧,正常用户可能被误封。建议在上线前用真实业务流量做压测,找到合适的阈值区间。
六、结语
限流算法的选择直接影响高防CDN的误封率和突发流量处理能力。令牌桶允许突发,漏桶平滑流量,滑动窗口精确统计。三种算法的组合使用,才能在不同场景下取得平衡。评估时需要确认服务商是否支持多种算法、限流维度是否丰富、阈值是否动态调整、是否有白名单和监控机制。这些细节,比“是否支持限流”这个简单的勾选项更能说明高防CDN在应用层的真实防护水平。