面试题答案
一键面试方案一:滑动窗口算法
- 优点:
- 解决了固定窗口在窗口切换瞬间的临界问题,能更精确地控制流量,使得限流更加平滑。
- 对流量的控制粒度更细,可以按照时间单位(如毫秒级)滑动窗口,根据业务需求灵活调整限流精度。
- 缺点:
- 实现相对复杂,需要记录更多的状态信息,占用更多的内存资源。例如,需要记录每个滑动窗口内的请求数量等。
- 计算量相对较大,每次请求都需要判断当前请求处于哪个滑动窗口内,并更新窗口内的请求计数等操作。
- 适用场景:
- 对限流精度要求非常高的场景,如金融交易系统,每一笔交易的频率都需要严格控制,防止恶意高频交易。
- 业务对流量控制的平滑性要求较高,如视频直播平台,避免瞬间大量请求导致服务器过载影响直播体验。
方案二:漏桶算法
- 优点:
- 可以平滑地处理请求,不管请求是突发还是均匀的,都能按照固定的速率处理,有效避免窗口切换瞬间的冲击。
- 实现相对简单,主要维护一个桶的容量和流出速率即可,不需要像滑动窗口那样记录复杂的窗口状态信息。
- 缺点:
- 无法应对突发流量,因为它是以固定速率处理请求的,如果突发流量过大,多余的请求只能被丢弃,可能会影响业务体验。
- 对系统资源的利用率可能不是最优,在流量较小时,系统可能无法充分利用资源来处理更多请求。
- 适用场景:
- 对请求处理速率要求稳定的场景,如短信发送平台,需要按照固定速率发送短信,避免给用户造成骚扰或系统过载。
- 对突发流量不敏感,且更注重系统稳定性和请求处理的均匀性的业务,如一些定时任务调度系统,按照固定频率执行任务,不需要处理突发大量任务的情况。
方案三:令牌桶算法
- 优点:
- 既能应对突发流量,又能限制平均速率。在流量较小时,令牌会不断积累,当突发流量到来时,可以消耗积累的令牌来处理请求,不会像漏桶算法那样直接丢弃突发请求。
- 实现也相对简单,主要维护令牌桶的容量、令牌生成速率等基本信息。
- 缺点:
- 虽然能应对突发流量,但如果突发流量过大且持续时间较长,令牌桶中的令牌可能会被耗尽,后续请求仍可能被限流,这可能会对业务产生一定影响。
- 对于非常严格的实时限流场景,由于令牌生成有一定间隔,可能无法做到像滑动窗口那样极其精确的限流。
- 适用场景:
- 互联网应用中常见的限流场景,如Web服务器的访问限流,既要允许一定程度的突发流量,又要限制总体访问频率,避免服务器被恶意请求或大量正常请求压垮。
- 游戏服务器的限流,既要保证玩家在正常操作时的流畅体验,能处理一定的突发操作,又要防止外挂等恶意高频请求破坏游戏平衡。