面试题答案
一键面试可能出现的问题
- 限流精度问题:固定窗口限流在窗口切换瞬间可能会出现流量突增情况。例如一个限流窗口为1分钟,允许通过100个请求,在0:59 - 1:00这1秒内来了100个请求,在1:00 - 1:01这1秒又来100个请求,实际在这2秒内通过了200个请求,超过了预期的每分钟100个请求的限制。
- 无法应对突发流量:固定窗口限流策略相对较为死板,当遇到短时间内突发流量超过窗口限制时,后续合法流量也会被限制。例如电商秒杀活动开始瞬间,大量请求涌入,固定窗口限流可能直接把后续一些正常的购买请求也限制掉,影响用户体验。
优化措施
- 滑动窗口算法:
- 原理:将固定窗口划分为多个小的子窗口,随着时间的推移,窗口像滑动一样移动。每次请求到来,计算当前请求在滑动窗口内的位置,判断是否超过限流阈值。
- 实际场景举例:以一个API接口限流为例,假设限流为每分钟100个请求。使用滑动窗口算法,将1分钟划分为60个1秒的子窗口。当一个请求到来时,计算当前时间在窗口中的位置,统计当前滑动窗口内的请求数量。如果请求数量未超过100,则允许通过;否则,限流。这样可以有效避免窗口切换瞬间的流量突增问题。
- 结合漏桶算法:
- 原理:漏桶算法的核心思想是水(请求)先进入到漏桶里,漏桶以一定的速度出水(处理请求),当水流入速度过大会直接溢出(拒绝请求)。结合Redis固定窗口限流,先通过固定窗口统计请求数量,再使用漏桶算法平滑处理请求,避免突发流量对系统造成过大冲击。
- 实际场景举例:在直播平台,直播推流接口可能会遇到主播开播瞬间的大量推流请求。先通过固定窗口限流统计一定时间内的推流请求数量,再利用漏桶算法以稳定的速度处理推流请求,保证系统不会因为突发流量而崩溃,同时也能合理分配资源处理正常请求。