限流是高并发系统保护下游服务、抵御流量洪峰的核心手段,是系统雪崩防护的最后一道防线。本文依次讲解时间窗口、漏桶、令牌桶三种主流限流模型,并基于 Go 语言结合 Redis + Lua 脚本实现高性能分布式限流器内核,可直接用于网关、业务服务线上部署。
从最简单的计数器到令牌桶,限流算法的演进本质是从"粗暴拒绝"到"流量整形"的工程哲学进化。
| 限流算法 | 能否应对突发 | 流量特征 | 典型使用场景 |
|---|---|---|---|
| 固定窗口 | ✕ 存在临界毛刺 | 波动大 | 简易低频风控 |
| 滑动窗口 | ✕ 短时允许峰值 | 波动可控 | 简单 API 限流 |
| 漏桶算法 | ✕ 严格匀速 | 绝对平滑 | 第三方接口调用 |
| 令牌桶算法 | ✓ 支持流量爆发 | 基础匀速,允许突峰 | 网关 / 秒杀 / Web 服务 |
两种桶算法的本质差异:漏桶强制匀速流出,不允许突发;令牌桶匀速生成令牌,积攒后可一次性消耗,允许短时爆发。
以下代码仅适用于单机单实例。集群多节点部署时,各个实例独立限流,无法实现全局流量管控,必须使用分布式限流。
分布式限流核心难点:多实例状态统一。使用 Redis 存储令牌桶状态,Lua 脚本保证整个令牌检查、消耗逻辑原子执行,避免并发竞态条件。
不推荐使用多个 Redis 命令分开执行,会产生并发漏洞。Lua 脚本在 Redis 内部单线程执行,整条命令具备原子性。
五类高频踩坑场景,每一类都对应过真实的线上故障。规避成本远低于复盘成本。
限流、熔断、降级共同构成高可用防护体系,限流作为第一道前置屏障,配合前文的秒杀系统架构,能够完整构筑抵御流量洪峰的防护链路。
限流的本质不是把流量挡在门外,而是让流量以可控的速率进入系统——这就是"整形"二字的含义。令牌桶允许突发,是在用户体验与系统保护之间找到平衡点;漏桶强制匀速,是在下游承受能力与上游调用频率之间筑起防线。
限流、熔断、降级共同构成高可用防护体系。限流作为第一道前置屏障,配合前文的秒杀系统架构,能够完整构筑抵御流量洪峰的防护链路。掌握令牌桶与漏桶的工程实现,是设计高可用分布式系统的基础能力。