1. 限流概述:为什么需要限流?

大家好,我是你们这次课程的主讲。在正式开始讲算法之前,我想先聊聊一个根本问题——我们为什么要限流?

说实话,我见过太多系统崩溃的案例了。有一次,一个电商平台搞秒杀活动,流量瞬间暴涨了 50 倍。结果呢?数据库连接池被打满,CPU 飙升到 99%,整个系统挂了将近 20 分钟。等恢复过来,订单已经丢了一大批。嗯,这就是典型的「没有限流」的后果。

什么是限流?

限流,说白了就是控制流量。你想想看,一个系统能处理的请求是有上限的。就像一条水管,每秒只能流过 10 升水。你非要灌 100 升,那水管肯定爆。

限流的定义其实很简单:限制单位时间内进入系统的请求数量,保证系统在安全水位下运行。

核心目标:

  • 保护系统——防止突发流量打垮后端服务
  • 公平分配——让每个用户都能获得合理的服务
  • 成本控制——避免资源被过度消耗导致费用飙升
  • 服务质量——保证核心业务的响应时间不恶化

限流 vs 熔断 vs 降级

这三个概念经常被混在一起说。我刚开始做架构的时候也搞混过。其实它们各有侧重:

概念 触发条件 动作 恢复方式
限流 请求速率超过阈值 拒绝部分请求 流量下降后自动恢复
熔断 错误率/延迟超过阈值 快速失败,停止调用 定时探测,成功则关闭
降级 系统压力过大 关闭非核心功能 手动或自动恢复

我习惯这么理解:限流是「挡在外面」,不让太多请求进来;熔断是「内部自保」,发现下游不行了就赶紧断开;降级是「丢卒保车」,砍掉不重要的功能保核心。

我的经验:实际项目中,这三个往往配合使用。比如先限流挡住大部分流量,如果还有异常就触发熔断,同时降级非核心接口。我曾经在一个支付系统中就是这样做的,效果很好。

限流的典型场景

哪些地方需要限流?我列几个常见的:

  • API 网关——对外暴露的接口,防止恶意刷接口
  • 秒杀/抢购——瞬间高并发,必须限流保护订单系统
  • 第三方接口调用——对方有 QPS 限制,自己也要限流防止被封
  • 数据库/缓存——防止连接池被打满
  • 消息队列——控制消费速率,防止下游处理不过来

避坑指南:我曾经在一个项目中,只对读接口做了限流,写接口没做。结果突发流量全打到写接口上,数据库直接挂了。记住——所有入口都要限流,不要有侥幸心理。

限流的维度

限流不是一刀切。你可以从不同维度来限制:

  • 按用户——每个用户每秒最多 10 次请求
  • 按 IP——每个 IP 每分钟最多 100 次
  • 按接口——某个接口总 QPS 不超过 1000
  • 按服务——整个微服务实例不超过 5000 QPS

你想想看,如果不按用户限流,一个恶意用户就能把整个系统的额度占满。所以实际项目中,我通常会做多级限流:网关层按 IP 限流,业务层按用户限流,服务层按总 QPS 限流。

限流的衡量指标

怎么判断限流做得好不好?我一般看这几个指标:

指标 说明 理想值
QPS 每秒请求数 不超过系统容量的 80%
拒绝率 被限流的请求占比 一般控制在 5% 以内
响应时间 请求处理耗时 限流后不应明显增加
系统负载 CPU/内存使用率 保持在 70% 以下

核心原则:限流不是要把流量降到 0,而是让系统在可控范围内运行。我一般把阈值设在系统容量的 70%-80%,留出缓冲空间。

限流的知识体系

下面这张图,是我自己总结的限流知识体系。你可以先有个整体印象:

限流知识体系 限流 为什么需要 定义与目标 与熔断降级关系 突发流量 恶意攻击 资源有限 保护系统 公平分配 成本控制 熔断 降级 配合使用 限流是系统防护的第一道防线 后续章节将深入讲解各种算法与实战配置

小结

这一章我们聊了限流的基本概念。说白了,限流就是给系统装个「水龙头」,流量大了就拧小一点。它和熔断、降级是三位一体的防护策略。

我个人觉得,理解限流的核心不在于算法多复杂,而在于什么时候限、限多少、怎么限。后面的章节,我会带着大家从最简单的计数器算法开始,一步步深入到令牌桶、漏桶这些经典算法,再到分布式限流的实战配置。

一句话记住:限流不是拒绝用户,而是保护用户能正常使用的那部分服务。宁可拒绝一部分,也不要让所有人都用不了。