多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Java高级后端 · 全套面试通关手册(限流方案设计)

Java高级后端 · 全套面试通关手册(限流方案设计) 一、限流是什么限流对请求流量进行控制保护服务防止突发大流量把服务打垮是系统防护的第一道防线。作用拒绝超出系统承载能力的请求保证核心业务正常可用。限流位置网关层Gateway/Nginx、应用层。二、4 种常用限流算法必考1. 固定窗口计数器原理把时间切成固定窗口例如 1s窗口内请求数累加超过阈值直接拒绝窗口结束计数器清零。✅优点简单好实现❌缺点临界突刺问题。窗口边界瞬间前后窗口流量叠加会出现 2 倍峰值容易击穿系统。2. 滑动窗口计数器改进固定窗口原理把大窗口切分成多个小格子窗口随时间滑动淘汰过期格子计数实时统计最近一段时间总请求。✅优点缓解临界突刺精度更高❌缺点窗口切分越多内存开销越大依然存在瞬时流量毛刺。3. 漏桶算法原理请求先进入桶内排队桶有容量桶底以固定速率匀速流出请求处理桶满则拒绝请求。 ✅特点输出流量恒定削峰不管入流量多大服务端收到请求速度平稳。❌缺点无法应对突发流量流量突增时请求排队等待延迟变高。适合流量整形控制下游处理速率。4. 令牌桶算法生产最常用原理按固定速率往桶里放令牌请求过来必须拿到令牌才能执行桶有最大容量令牌满了就丢弃令牌。✅优点可以应对突发流量桶内预存的令牌可以一次性处理短时峰值控制平均 QPS。❌缺点实现略复杂。适用场景网关 Sentinel、Gateway 限流。一句话区分漏桶是出水固定令牌桶是放令牌固定可以预存令牌应对突发流量。三、限流粒度背全局限流整个服务总 QPS 上限接口粒度单独对某个接口限流如下单接口IP 限流限制单个 IP 的请求频次防爬虫用户 ID 限流登录用户按账号限流集群限流多实例服务统一控制整个集群总流量难点依赖 Redis四、落地实现方案1. Nginx 限流网关层底层漏斗 / 固定窗口limit_req限流基于漏桶。优点在最前端拦截直接挡掉非法流量不打到后端服务。2. Sentinel 限流应用层Java 微服务首选支持多种限流算法支持热点参数限流控制台动态修改限流规则。直接限流 QPS热点参数限流例如按商品 ID 限流热门商品单独限制流量3. Redis Lua分布式限流集群限流多个服务实例共享 Redis 计数Lua 脚本保证计数 判断原子性。缺点Redis 有网络开销高并发场景 Redis 会成为瓶颈。五、限流后的处理策略直接拒绝返回提示 “请求过于频繁请稍后重试”排队等待有限等待超时失败漏桶降级返回兜底数据限流触发返回缓存兜底页面预热冷启动缓慢提升阈值避免刚上线瞬间打垮服务六、高频深挖面试题Q1令牌桶和漏桶怎么选A需要应对突发流量选令牌桶需要严格控制输出速率、平滑流量选漏桶。Sentinel 默认令牌桶。Q2单机限流和分布式限流区别A单机限流只限制当前实例流量多实例部署总流量 实例数 * 单机阈值分布式限流Redis控制整个集群总 QPS但是有 Redis 网络开销存在性能瓶颈。Q3热点参数限流是什么ASentinel 特有。针对请求参数限流例如秒杀场景限制单个商品 ID 的访问频次防止某个热点商品打爆服务。Q4限流、熔断、降级三者区别A限流挡入口流量防止大量请求进入系统熔断下游服务故障停止调用下游快速失败降级关闭非核心业务保障核心流程。顺序限流在最前面先挡住超额流量。Q5固定窗口临界问题怎么解决A改用滑动窗口或者使用令牌桶 / 漏桶。七、背诵小结四种限流算法固定窗口临界突刺、滑动窗口、漏桶匀速出水削峰、令牌桶预存令牌支持突发流量限流位置Nginx 网关层、Sentinel 应用层、RedisLua 分布式集群限流粒度全局、接口、IP、用户、热点参数限流是第一道防护在熔断降级之前执行。
返回列表