
1) 【一句话结论】:为保护Azure API网关的请求处理能力,推荐采用令牌桶算法,通过动态调整令牌生成速率(如每秒R个令牌)和桶容量(如C个令牌),允许突发流量(短时间超速),同时结合排队机制处理突发峰值,平衡系统稳定性和用户体验。
2) 【原理/概念讲解】:老师口吻解释核心概念。令牌桶(Token Bucket)的核心是“允许突发,但速率受限”:系统维护一个“桶”,以固定速率R生成令牌(Token),桶容量为C。请求处理时,需要消耗令牌,若桶中有令牌则处理请求,否则拒绝或排队。类比:银行账户存款(令牌)和取款(请求),存款速率固定(R),账户余额(桶容量)有限,若余额足够,可立即取款;若不足,需等待存款(生成令牌)。漏桶(Leaky Bucket)则是“限制恒定速率”:请求以速率R进入桶,桶以速率R流出,超出部分丢弃,类似水龙头注水,水以恒定速率流出,不能积压太多。令牌桶更适合需要应对突发流量的场景,因为漏桶会丢弃突发请求,而令牌桶能平滑处理。
3) 【对比与适用场景】:
| 算法类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 令牌桶 | 维护容量为C的桶,以速率R生成令牌,请求消耗令牌 | 允许突发流量(短时间超速),速率受限 | 需应对突发请求(如API网关流量波动,如电商促销、新闻资讯) | 需合理设置R和C,避免频繁拒绝或系统过载 |
| 漏桶 | 维护容量为C的桶,请求以速率R进入,桶以速率R流出 | 严格限制恒定速率,丢弃超出部分 | 需严格限制流量速率(如网络带宽限制,如视频流、实时通信) | 丢弃突发请求,可能导致用户体验下降 |
4) 【示例】:伪代码(Python风格):
class TokenBucket:
def __init__(self, rate, capacity):
self.rate = rate # 每秒生成令牌数
self.capacity = capacity # 桶容量
self.tokens = capacity # 当前令牌数
self.last_time = time.time() # 上次生成令牌时间
def consume(self, tokens_needed=1):
now = time.time()
elapsed = now - self.last_time
# 生成新令牌
self.tokens = min(self.capacity, self.tokens + self.rate * elapsed)
self.last_time = now
if self.tokens >= tokens_needed:
self.tokens -= tokens_needed
return True # 允许处理请求
else:
return False # 请求被拒绝(或排队)
# 示例:Azure API网关限流
bucket = TokenBucket(rate=10, capacity=100) # 每秒10个令牌,桶容量100
for request in incoming_requests:
if bucket.consume():
process_request(request) # 处理请求
else:
queue_request(request) # 排队处理(或拒绝,根据策略)
突发流量处理:假设突发流量在1秒内(T=1秒),允许的额外令牌数为RT + C(即101+100=110个请求),超过此数则拒绝或排队。
5) 【面试口播版答案】:(约90秒)
“面试官您好,针对Azure API网关的高并发限流问题,我建议采用令牌桶算法。核心思路是维护一个令牌桶,以固定速率生成令牌,请求处理时消耗令牌。具体来说,参数设置上,令牌生成速率(Rate)设为API网关的期望处理速率(比如每秒10个请求),桶容量(Capacity)设为突发流量的缓冲量(比如100个令牌)。这样,正常情况下请求按速率处理,遇到突发流量时,短时间内可以处理更多请求(比如1秒内最多处理110个请求,即10*1+100),避免系统过载。突发流量处理方面,超过允许的突发量后,请求会进入排队队列,或者根据业务策略(如优先级)处理,确保系统稳定。令牌桶相比漏桶,更适合API网关这种需要应对流量波动的场景,因为它允许突发,而漏桶会丢弃突发请求。参数动态调整的话,可以结合API网关的监控数据(如当前负载、请求延迟),实时调整Rate和Capacity,比如负载高时降低Rate,负载低时提高Rate,实现自适应限流。”
6) 【追问清单】:
7) 【常见坑/雷区】: