后端岗位面试题更新 2026-08-05

在一个企业级 AI 网关项目中,需要为不同服务或 API 实施分布式限流。请说明其实现原理,并描述常见的实现方案有哪些?

后端开发系统设计技术原理方案权衡Redis

考察说明

考查候选人对分布式限流原理、实现方案及工程实践的掌握程度。

回答思路

  1. 【回答框架 1】分布式限流首先需明确其与单机限流的区别:单机限流在本地内存维护计数器,而分布式限流需要跨多个网关节点共享状态,以保证全局速率限制的一致性。核心难点在于如何高效、可靠地在多节点间同步计数。
  2. 【回答框架 2】常见的实现方案之一是基于 Redis 的固定窗口或滑动窗口算法。固定窗口实现简单,直接对 Redis 中 key 进行 INCR 并设置过期时间,但存在临界突变问题。滑动窗口则可采用 ZSet 记录时间戳,通过统计窗口内的请求数实现更平滑的限制,但内存占用较高。
  3. 【回答框架 3】另一个常用方案是令牌桶算法,可结合 Redis Lua 脚本实现原子操作。例如,使用一个 key 存储令牌数,另一个 key 存储最后补充时间,通过 Lua 脚本一次性执行补充令牌和取出令牌的逻辑,保证原子性,同时支持突发流量,限流更平滑。
  4. 【回答框架 4】漏桶算法也可用于限流,它强制请求以固定速率流出,适合平滑突发流量,但实现上通常需要队列或 Redis 列表,若请求量过大可能导致积压。在实际企业级网关中,还可能采用分布式消息队列或一致性哈希分片来分摊计数压力。
  5. 【回答框架 5】选择方案时需考虑性能、一致性和复杂度。Redis 方案高并发下吞吐量较大,但要防止 Redis 成为单点,需结合集群或读写分离;同时设置合理的超时和降级策略,避免依赖 Redis 不可用导致网关雪崩。最终方案需结合技术栈和业务场景取舍。
  6. 【关键点 1】分布式限流需共享全局状态,Redis 是实现计数器的常用组件。
  7. 【关键点 2】滑动窗口和令牌桶可处理突发流量,实现平滑限流。
  8. 【关键点 3】使用 Lua 脚本保证限流操作的原子性。
  9. 【关键点 4】需考虑 Redis 单点故障,可采用高可用集群和降级策略。
  10. 【关键点 5】没有百分百精确的限流,需权衡性能与精度,允许一定误差。
  11. 【易错点 1】不要把限流与幂等混淆,限流无法保证业务幂等,幂等需额外唯一标识和状态记录。
  12. 【易错点 2】过度依赖 Redis 可能导致限流本身成为瓶颈,需评估性能并设计降级方案。
  13. 【易错点 3】固定窗口存在临界问题,不适合对精确性要求高的场景。