1.1 课程导论:熔断机制与限流算法概述

在微服务与高并发系统中,熔断与限流是保障服务稳定性的两大核心手段。熔断关注调用链的故障隔离,限流关注入口流量的平滑控制。本课程将围绕“熔断窗口”与“Redis令牌桶”展开实战讲解。

1.1.1 熔断机制:快速失败与恢复

熔断机制借鉴了电路断路器的思想:当某个下游服务持续超时或异常时,熔断器打开,直接拒绝后续请求,避免级联故障。熔断器通常包含三种状态:

  • 关闭(Closed):正常调用,统计失败次数。
  • 打开(Open):失败阈值达到,直接拒绝请求。
  • 半开(Half-Open):经过熔断窗口时间后,放行少量探测请求,判断服务是否恢复。
关键指标:熔断窗口(窗口时长)、失败阈值(次数或比例)、半开探测数。

1.1.2 限流算法:令牌桶与漏桶对比

限流算法决定了请求被允许通过的速率。下表对比了两种主流算法:

对比维度 令牌桶(Token Bucket) 漏桶(Leaky Bucket)
核心思想 以恒定速率生成令牌,请求需获取令牌才能通过 请求以固定速率流出,超出桶容量的请求被丢弃
突发处理 允许一定程度的突发(桶内可累积令牌) 严格平滑,不允许突发
实现复杂度 中等,需维护令牌生成与消费 较低,队列+定时器即可
适用场景 允许短时突发的业务(如秒杀、API调用) 流量必须绝对平滑的场景(如数据库写入)
Redis实现 常用Lua脚本+有序集合或String 可用List+定时任务模拟
选型建议:本课程选择令牌桶作为核心算法,因为它更贴合互联网业务“允许突发、控制平均速率”的需求,且Redis实现灵活高效。

1.1.3 Redis在限流中的角色

Redis凭借其单线程模型、原子操作和丰富的数据结构,成为分布式限流的事实标准。在令牌桶场景中,Redis承担以下职责:

  • 令牌存储:使用String或Hash存储当前令牌数、上次刷新时间。
  • 原子扣减:通过Lua脚本保证“获取令牌”操作的原子性。
  • 分布式共享:所有服务实例共享同一个Redis实例,实现全局限流。
  • 熔断窗口:利用Redis的TTL或ZSet实现滑动窗口统计。
熔断与限流整体架构图 熔断与限流整体架构 客户端 限流层(令牌桶) 熔断层(断路器) 下游服务 Redis 令牌桶 Redis 熔断窗口 说明: 请求先经过限流层(令牌桶)控制速率,再经过熔断层(断路器)保护下游。Redis同时存储令牌桶状态和熔断窗口统计数据。

1.1.4 熔断窗口与令牌桶的协同

熔断窗口与令牌桶并非独立工作,而是形成双层防护:

  1. 第一层:令牌桶限流 — 控制入口QPS,防止流量洪峰冲垮系统。
  2. 第二层:熔断窗口 — 监控调用失败率,当下游异常时快速熔断。
  3. 协同点:熔断打开期间,令牌桶依然可以拒绝请求,但熔断半开时需放行少量探测请求,此时令牌桶需配合放行。
常见误区:限流不能替代熔断,熔断不能替代限流。限流是主动防御,熔断是被动保护。两者结合才能构建高可用的分布式系统。
令牌桶与漏桶对比流程 令牌桶 vs 漏桶 流程对比 令牌桶 恒定速率生成令牌 桶内累积令牌(最大容量) 请求消耗令牌 → 通过 令牌不足 → 拒绝/等待 漏桶 请求进入桶(队列) 桶满 → 新请求丢弃 恒定速率流出(处理) 严格平滑,无突发

1.1.5 课程实战路线

本课程将从零搭建一个基于Redis的熔断窗口+令牌桶限流系统,涵盖以下核心模块:

  • Redis令牌桶实现:Lua脚本原子操作、令牌预取与补偿。
  • 滑动窗口熔断:基于Redis ZSet的滑动窗口统计与状态切换。
  • Spring Boot集成:自定义注解+AOP实现声明式限流与熔断。
  • 压测与调优:JMeter压测、Redis性能优化、参数调优。
前置知识:熟悉Java基础、Spring Boot基础、Redis基本操作(String、ZSet、Lua脚本)。无需分布式系统经验,课程会从原理讲起。