第2章:限流降级的核心思想与适用场景

限流和降级,这两个词听起来挺像的。很多新手容易搞混。

我刚开始带团队的时候,有个同事问我:“限流和降级不就是一回事吗?都是不让请求过去呗。” 我当时笑了笑,说:“你想想看,一个是拦住,一个是放弃,本质逻辑完全不同。”

这一章,我们就来把这两个概念彻底掰扯清楚。我会结合我在几个高并发项目里的真实经历,帮你建立一套清晰的判断标准。

2.1 限流:把流量控制在系统能承受的范围内

限流,说白了就是主动拒绝超出预期的请求。

你的系统能力是有限的。比如你的数据库每秒只能处理 1000 个查询。如果突然来了 5000 个请求,你不拦着,数据库就会挂掉。限流就是在这 5000 个请求到达数据库之前,先扔掉 4000 个。

核心目标:保护系统不被突发流量冲垮,保证核心服务的可用性。

我在项目中遇到过这样一个场景:某次大促活动,零点刚过,流量瞬间飙升到平时的 50 倍。如果没有限流,网关层直接被打穿,所有服务都会雪崩。嗯,那场面,想想都后怕。

2.1.1 限流的典型适用场景

  • 秒杀/抢购活动:瞬间涌入的流量远超系统处理能力,必须在前置网关层做限流。
  • API 接口保护:防止外部恶意调用或爬虫程序耗尽你的资源。
  • 数据库/缓存保护:避免突发查询打垮底层存储。
  • 第三方接口调用:对方有 QPS 限制,你必须在客户端做限流,否则会被封。

我的习惯:限流尽量做在最外层,比如 Nginx 层或 API 网关层。越早拦截,对后端资源的消耗越小。

2.2 降级:在压力下主动放弃非核心功能

降级和限流不一样。降级不是“拦住请求”,而是主动关闭一些不重要的功能,把资源腾出来给核心功能。

举个例子:你做了一个电商网站。用户下单是核心功能,而“查看历史订单”是非核心功能。当系统压力过大时,你可以暂时关闭“查看历史订单”功能,返回一个“系统繁忙,请稍后再试”的提示。这样,数据库的连接数就省下来了,下单功能就能继续正常运行。

核心目标:牺牲非核心功能,保障核心功能的可用性和响应速度。

我曾经在一个项目中犯过错误。当时我们做了一个“个性化推荐”模块,觉得它很重要。结果流量一上来,推荐模块占用了大量 CPU,导致下单接口超时。后来我们才意识到,对于用户来说,“能下单”比“看到什么推荐”重要得多。从那以后,我就把推荐模块标记为“可降级”了。

2.2.1 降级的典型适用场景

  • 非核心业务接口:比如日志上报、用户行为分析、消息推送。
  • 耗时较长的计算任务:比如报表生成、数据导出。
  • 依赖的外部服务:当第三方服务响应变慢或不可用时,主动降级,避免自身线程被阻塞。
  • 读多写少的场景:可以降级为读取缓存中的旧数据,放弃实时查询。

注意:降级不是永久关闭。你需要设计一个恢复机制。当系统压力下降后,要能自动或手动把降级的功能恢复回来。

2.3 限流 vs 降级:一张表看懂区别

很多同学会混淆这两个概念。我整理了一张对比表,你一看就明白了。

对比维度 限流 降级
核心动作 拒绝请求 关闭功能
触发条件 流量超过预设阈值 系统资源紧张或依赖故障
影响范围 部分用户请求被拒绝 所有用户的部分功能不可用
恢复方式 流量下降后自动恢复 需要手动或自动恢复功能
典型实现 令牌桶、漏桶、计数器 开关配置、熔断器
用户体验 直接返回“请求过于频繁” 返回“功能暂不可用”或降级数据

你看,限流是对“量”的控制,降级是对“质”的取舍。两者相辅相成,并不冲突。

2.4 限流降级的整体决策流程

在实际项目中,我们不会单独使用限流或降级。通常是一套组合拳。下面这张图,是我自己总结的决策流程。

限流降级决策流程图 请求到达 是否超过限流阈值? (QPS / 并发数) 是(超限) 拒绝请求 否(通过) 是否触发降级条件? (资源紧张 / 依赖故障) 是(触发) 执行降级策略 否(正常) 正常处理请求 返回响应 限流失败后的兜底

这个流程很简单:

  1. 先限流:请求进来,先判断是否超过限流阈值。超了就直接拒绝,不废话。
  2. 再降级:没超限流阈值,但系统资源已经紧张了,或者某个依赖服务挂了。这时候就要判断是否触发降级条件。
  3. 正常处理:既没超限流,也没触发降级,那就正常处理。

我的建议:限流和降级的判断顺序不要搞反。先限流,再降级。因为限流是“硬性拦截”,成本最低。降级是“软性妥协”,需要业务逻辑配合。

2.5 什么时候该用限流?什么时候该用降级?

这个问题,我经常被问到。其实判断标准很简单,就两句话:

  • 如果问题是“流量太大”:用限流。比如秒杀、爬虫攻击。
  • 如果问题是“资源不够”或“依赖挂了”:用降级。比如数据库连接池满了、第三方接口超时。

当然,更多时候是两者结合。比如双十一大促,你既要限流(控制总流量),又要降级(关闭非核心功能)。

避坑指南:我曾经在一个项目里,把降级当限流用。当时觉得“功能降级了,流量自然就小了”。结果呢?降级确实关闭了功能,但请求量一点没少,网关层还是被打穿了。后来我才明白,降级只能释放后端资源,不能减少网络连接数。要减少连接数,必须靠限流。

2.6 本章小结

限流和降级,是高并发系统的两把保护伞。限流负责“挡”,降级负责“让”。两者目标一致:保证系统在极端压力下,依然能提供核心服务。

记住我给你的那个决策流程图。以后遇到高并发场景,先想清楚:我是要限流,还是要降级,还是两个都要?