想象你是一家大型游乐园的运营总监。周末人山人海,过山车、旋转木马前都排着长队。如果某个项目的设备出了故障,你不及时挂上“暂停开放”的牌子,游客还会继续涌入,队伍越排越长,甚至引发踩踏事故。更危险的是,如果整个园区的游客密度超过承载上限,连疏散通道都会被堵死。你需要一套“人流治理系统”:限制每个项目的接待速度、在设备故障时自动关闭检修、高峰期简化服务流程、全天监控园区整体负载——这就是微服务世界里 Sentinel 做的事。它是阿里开源的流量治理组件,专门保护你的后端接口不被突发流量打垮。 在这篇文章里,我们会一起搭建这座“数字游乐园”:先认识 Sentinel 的核心概念,再看滑动窗口如何精确统计流量,然后逐个掌握限流、熔断、降级、系统保护四大能力的配置方法,最后通过实战代码把整套保护机制跑起来。

岗位关联

掌握 Sentinel 是微服务高可用架构师的必备技能。理解了它,你就能在生产环境从容应对秒杀洪峰、下游故障等各类流量危机,让自己的服务永远稳如泰山。

目录
  1. 可视化演示
  2. 核心概念
  3. 滑动窗口
  4. 限流配置
  5. 热点参数
  6. 熔断状态机
  7. 降级策略
  8. 系统保护
  9. 实战应用
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示Sentinel熔断状态机三态转换(Closed→Open→Half-Open+慢调用/异常比/异常数触发条件)、三种限流策略(直接拒绝/预热WarmUp/排队等待+QPS曲线+滑动窗口统计)与插槽链流水线(6插槽+四大能力+轻量级性能指标),交互切换核心维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

熔断状态机三态转换 Closed(正常):请求正常通过,统计窗口记录RT和异常率 Open(熔断):触发条件满足后熔断,直接拒绝所有请求,等待10s Half-Open(探测):放行单个探测请求,成功→Closed,失败→Open 触发:慢调用(RT>200ms) | 异常比(>50%) | 异常数(>5次) | 状态:Closed→Open→Half→Closed 三态循环保护系统稳定性

核心概念

游乐园的运营调度中心墙上有块巨大的告示板,上面写着每个游乐项目的实时状态:过山车每分钟放行 30 人、旋转木马每分钟放行 40 人,哪个项目排队超长就会亮黄灯。在微服务世界里,Sentinel 就是这块告示板后面的“大脑”。它把每一个需要保护的接口调用称为一个资源——就像游乐园里的每个游乐项目;然后对着资源配置各种规则——就像告示板上的容量限制。

Sentinel 的规则落到代码里,本质是回答一句话:这个请求到底放不放行?取决于三类规则的综合判断:限流规则看流量是否超速,熔断规则看下游是否已经故障,降级规则看是否存在更优的兜底方案。只有全都通过,请求才会被送到真正的业务逻辑里。

回到游乐园的比喻:调度中心的每一个亮灯告警,背后都是一条 Sentinel 规则在实时计算。这四大能力——限流、熔断、降级、系统保护,构成了微服务防线的第一道闸门。理解了“资源 + 规则 + 判定”这个铁三角,后面所有的配置都是在往这个框架里填参数。

Allow=(QPS≤Tlimit)∧(State≠OPEN)∧(Degrade=False)\text{Allow} = (QPS \leq T_{limit}) \land (\text{State} \neq \text{OPEN}) \land (\text{Degrade} = \text{False})
这个公式是说:一个请求能通过,要同时满足“每秒速率没超限流阈值”、“熔断器没有打开”和“没有触发降级”三个条件,缺一不可。
  1. 限流条件当前 QPS(每秒请求数)不能超过配置的限流阈值,相当于游乐园里“每秒放进 30 人”的闸机。
    QPS≤TlimitQPS \leq T_{limit}
  2. 熔断条件熔断器不能处于打开状态,相当于故障设备挂着的“暂停开放”牌子。
    State≠OPEN\text{State} \neq \text{OPEN}
  3. 降级条件不能已经触发了降级策略,相当于高峰期取消了 VIP 通道,正在执行简化模式。
    Degrade=False\text{Degrade} = \text{False}

滑动窗口

游乐园门口,安保队长最头疼的问题不是人多,而是怎么知道“此刻”有多少人正在排队入场。他不可能每分钟重置一次计数——那会漏掉大量在边界时刻混进来的人。于是他想了个办法:手里拿一把不断向前滚动的“一小时尺子”,尺子覆盖到的都是最近入场的游客,超过一小时的人自然移出尺子范围。这把尺子,就是滑动窗口。

更早的实现里,有人用“固定窗口”:每 1 分钟清零一次计数器。但这样会在分钟交界处出现漏洞——59.9 秒时放满了 1000 人,0.1 秒后又放满 1000 人,实际 0.2 秒内涌入了 2000 人。Sentinel 采用滑动窗口,把时间切成很多小格子,窗口整体向前滚动,任何时刻统计的都是“最近这段时间”的真实数据,彻底消除边界突刺。

安保队长的“滚动尺子”就是 Sentine l 的滑动窗口算法:它不关心 10 分钟前有多少人,只看眼前这把尺子覆盖的范围内有多少人。正因为统计足够精确,限流阈值的判断才真正可靠。这也是为什么 Sentinel 能在高并发场景下保持低延时的原因——每个请求只需查一次本地内存中的计数器就能完成统计。

QPS=NwinΔtwinQPS = \frac{N_{win}}{\Delta t_{win}}
Sentinel 把最近 1 秒切成若干个采样桶,只统计落在当前窗口内的请求数,再除以窗口时长,就得到了实时 QPS。
  1. 统计窗口内请求数把每个请求按到达时间放进对应的时间桶,累加出窗口内的总数。
    Nwin=∑k=1nI(tk∈[tnow−Δt,tnow])N_{win} = \sum_{k=1}^{n} I(t_k \in [t_{now} - \Delta t, t_{now}])
  2. 计算每秒速率用窗口内的请求总数除以窗口时长,得出每秒流量速率。
    QPS=NwinΔtwinQPS = \frac{N_{win}}{\Delta t_{win}}

限流配置

新项目“雷霆过山车”开业那天,运营总监没有让它一上来就满载运行,而是规定前 5 分钟只放 20% 的容量,之后每分钟放宽一些,直到完全放开。为什么?因为新项目需要“热身”——设备、人员、疏散流程都需要逐步进入状态,一上来就满载反而容易出事故。Sentinel 的 Warm Up 预热 就是这个原理的翻版。

限流配置有两个核心维度:QPS 限流和线程数限流。QPS 限流控制“每秒最多处理多少个请求”,适合大多数接口场景;线程数限流控制“同时占用多少个线程”,适合防止请求把线程池打满。Sentinel 还提供了三种流控效果:快速失败(直接拒绝)、Warm Up(阈值从低到高平滑放开)、排队等待(让请求排队慢慢通过)。

游乐场里还有“关联限流”的场景:激流勇进排队太长时,暂时限制旁边纪念品商店的放行速度,避免人流在交叉路口拥堵。Sentinel 的关联规则同理:当资源 A 的流量超过阈值时,对资源 B 实施限流。这套“刚柔并济”的配置,让限流不再是一刀切,而是有节奏地引导流量。

QPSallow(t)=QPSmax×tTwarmUpQPS_{allow}(t) = QPS_{max} \times \frac{t}{T_{warmUp}}
预热期间,实际生效的限流阈值不是最终的 QPS_max,而是随时间线性上升的一个值,直到预热期结束才达到满额。
  1. 确定最终阈值QPS_max 是预热完成后系统能稳定承载的最大速率。
    QPSmaxQPS_{max}
  2. 计算预热比例当前时刻距离启动开始的时间 t,占预热总时长的比例。
    tTwarmUp\frac{t}{T_{warmUp}}
  3. 得到当前阈值最终阈值乘以预热比例,就是此刻真正生效的限流值。
    QPSallow(t)=QPSmax×tTwarmUpQPS_{allow}(t) = QPS_{max} \times \frac{t}{T_{warmUp}}

热点参数

游乐园里总有那么一两个明星项目,比如新引进的 5D 飞船,80% 的游客排队都冲着它去。运营总监给所有普通项目定了统一的排队上限,但唯独给 5D 飞船单独画了一条线:排队超过 50 人就开始限流,因为它的舱位少、体验时间长。这就是热点参数限流——针对同一个接口里不同的参数值,进行差异化管控。

为什么需要它?假设你的商品详情接口每秒最多处理 1000 个请求。平时均匀分布没问题,但双十一当天“爆款商品”的 ID 被大量用户点击,这一个商品 ID 的流量就占到了 800 以上,把其他所有商品的流量都挤掉了。Sentinel 可以对接口的第几个参数(参数索引)单独做统计,让每个参数值各自占用额度,谁超了限谁。

除了给所有参数值设一个默认阈值,Sentinel 还支持给某些“例外参数”单独设阈值:比如 5D 飞船的黄金时段票,允许更高的流量。回到比喻,这就是给明星项目开一个专属闸机,普通项目的拥堵影响不到它,它自己的爆火也不会挤占公共资源。热点参数限流是应对“流量倾斜”场景的利器。

QPSp=NpΔtQPS_{p} = \frac{N_{p}}{\Delta t}
N_p 是“某个特定参数值 p”在最近一个时间窗口内出现的请求次数。Sentinel 对这种参数值单独开一个计数器,超阈值就拒绝携带该参数值的请求。
  1. 定位参数值确定要治理的热点参数,例如商品详情接口中代表“商品 ID”的那一个参数。
    p=argparamp = \text{arg}_{param}
  2. 独立计数统计最近窗口内,所有携带该参数值的请求总数。
    Np=∑kI(paramk=p)N_{p} = \sum_{k} I(param_k = p)
  3. 计算单值速率用该参数值的请求数除以窗口时长,得到单个商品 ID 的实时 QPS。
    QPSp=NpΔtQPS_{p} = \frac{N_{p}}{\Delta t}

熔断状态机

游乐设施的安全管理条例里有一条规定:设备一旦连续报警 3 次,立刻停机检修,维修 20 分钟后再以“降速试运行”的方式重新接待少量游客,确认安全后才能恢复满载运行。这个“停机 — 检修 — 试运行”的循环在 Sentinel 里叫熔断状态机,它有三个状态:关闭(正常)、打开(拒绝一切请求)、半开(试探性放行)。

熔断器一开始是关闭状态,请求正常通过。当统计窗口内异常比例或异常数超过阈值时,熔断器从关闭切换到打开状态,此时所有请求直接短路返回,不再打到下游——就像设备故障时直接挂牌,游客连队都不用排。经过一段时间后,熔断器进入半开状态,放行几个探测请求试试水,成功了就恢复关闭,失败了立刻回到打开。

熔断最大的价值是“快速失败”:下游已经着火了,就别让上游继续往里泼油。半开状态则是 Sentinel 给出的优雅解——它不靠人工介入,而是让系统自己“试运行”来感知故障是否恢复。这套闭环状态机保证了服务在故障面前既果断又宽容。

Open:EN>RthresholdorE≥K\text{Open}: \frac{E}{N} > R_{threshold} \quad \text{or} \quad E \geq K
E 是统计窗口内的异常请求数,N 是总请求数。当“异常比例超过阈值”或者“异常数达到指定次数”时,熔断器就会打开。
  1. 统计异常请求数在每个调用周期内累计失败的请求,失败可能是超时、抛出异常或返回错误码。
    E=∑kI(failurek)E = \sum_{k} I(failure_k)
  2. 计算异常比例用异常数除以总请求数,衡量当前故障的严重程度。
    EN\frac{E}{N}
  3. 触发熔断当比例超过预设阈值,或者异常绝对数量达到上限 K 时,正式熔断。
    Open:EN>RthresholdorE≥K\text{Open}: \frac{E}{N} > R_{threshold} \quad \text{or} \quad E \geq K

降级策略

停电的夜晚,游乐园不会直接关门,而是启动应急照明、暂停大型演出、只保留餐饮和疏散通道的基本服务——牺牲次要功能,保住核心体验。微服务里的降级就是这么回事:当某个非关键服务的失败率升高时,暂时停掉它,或者让接口直接返回一个默认兜底值(比如首页推荐位显示缓存内容),确保主流程不被拖垮。

Sentinel 的降级规则主要看三种指标:异常比例(窗口内异常数占比超阈值就降级)、慢调用比例(响应时间超过设定值的请求占比超阈值就降级)、异常数(窗口内异常数量超阈值就降级)。降级和熔断的区别在于:熔断是“电路坏了自动跳闸”,降级是“战略性放弃次要功能”。

降级策略是“留得青山在”的智慧:当核心交易的调用链路中有一步变慢,与其耗死所有线程,不如快速返回降级结果,保障用户的整体体验。在微服务架构里,降级往往和熔断配合使用——熔断切断故障链路,降级为被切断的接口提供备用响应,两者一起兜住系统的底线。

SlowRatio=Nrt>TNtotal>Rslow⇒DegradeSlowRatio = \frac{N_{rt > T}}{N_{total}} > R_{slow} \Rightarrow \text{Degrade}
慢调用比例公式:如果响应时间超过阈值 T 的请求数占总请求数的比例高于 R_slow,就判定服务变慢,触发降级。
  1. 筛选慢请求统计窗口内所有响应时间超过设定阈值 T 的请求。
    Nrt>TN_{rt > T}
  2. 计算慢调用占比慢请求数除以窗口内总请求数,得到慢调用比例。
    SlowRatio=Nrt>TNtotalSlowRatio = \frac{N_{rt > T}}{N_{total}}
  3. 触发降级当慢调用比例超过降级阈值,就切换为降级策略,返回兜底结果。
    SlowRatio>Rslow⇒DegradeSlowRatio > R_{slow} \Rightarrow \text{Degrade}

系统保护

游乐园最怕的不是某个项目排队,而是整个园区的人流密度失控。当园区总人数超过安全容量时,就算每个项目都正常,疏散通道也会被堵住。所以运营总监还会盯着一块总仪表盘:园区实时总人数、停车场剩余车位、电力负载、安保人员数量——任何一个指标逼近红线,就启动“全网限流”。Sentinel 的系统保护规则就是这块总仪表盘。

系统保护不针对某个接口,而是站在整个应用的高度看问题。它综合监控系统的 Load(系统负载)、CPU 使用率、入口线程数和入口 QPS 等指标。当系统快要过载时,它会自动降低入口流量,而不是等到某一个接口被打挂再补救。这种保护是“自适应”的——阈值会随着系统自身承载能力动态调整。

园区总容量保护是最后一道防线:前面讲的限流、熔断、降级都是“单个项目”级别的保护,而系统保护是“整个园区”级别的兜底。它确保在极端流量下,至少系统本身还能响应用户请求,而不是所有线程都在排队等 CPU,最终全军覆没。

load=LsystemCcores>1⇒限制入口流量load = \frac{L_{system}}{C_{cores}} > 1 \Rightarrow \text{限制入口流量}
当系统归一化负载超过 1(即系统当前负载超过 CPU 核数能处理的范围)时,Sentinel 开始对入口流量进行限制,防止雪崩。
  1. 读取系统负载操作系统会报告最近一段时间的平均负载,单位是“处于运行/等待状态的进程数”。
    LsystemL_{system}
  2. 归一化负载把负载除以 CPU 核数,得到“每个核平均承担多少任务”。
    load=LsystemCcoresload = \frac{L_{system}}{C_{cores}}
  3. 过载保护当归一化负载超过 1,说明 CPU 已经忙不过来,开始限制入口流量。
    ⇒限制入口流量\Rightarrow \text{限制入口流量}

实战应用

现在我们把目光移到游乐园的中央控制室:大屏幕上实时显示每个项目的运行状态、排队人数、设备报警信息。这就是 Sentinel 的 Dashboard 控制台——通过它,你可以看到每个接口的实时流量曲线、拒绝次数、熔断事件,还能在线修改限流阈值,调整完即时生效,无需重启。

实际接入 Sentinel 通常分三步:引入依赖并配置连接 Dashboard 的地址;在业务代码中用注解或代码块标注要保护的资源;然后在控制台或代码里配置规则。一个常见问题是规则默认存在内存里,服务一重启就丢了,所以生产环境一定要做规则持久化,把规则存到 Nacos 或 Zookeeper 等配置中心,实现动态推送。

控制室再先进,也离不开值班员的持续监控。Sentinel 的指标数据可以对接 Prometheus 等监控告警系统,形成“配置 → 运行 → 监控 → 调整”的闭环。就像游乐园每隔一段时间就要根据客流规律调整各项目的放行人数一样,你的限流阈值也应该跟着业务流量、机器规格、促销节奏动态变化。

QPScluster=QPSsingle×NnodesQPS_{cluster} = QPS_{single} \times N_{nodes}
集群限流容量估算公式:整个集群能承受的 QPS,约等于单机容量乘以机器数量。这是容量规划和阈值设定的第一步。
  1. 获取单机容量通过压测得出单台机器能稳定处理的最大 QPS。
    QPSsingleQPS_{single}
  2. 计算集群总量单机容量乘以集群节点数,得到理论集群上限。
    QPScluster=QPSsingle×NnodesQPS_{cluster} = QPS_{single} \times N_{nodes}
  3. 设定保护阈值实际阈值通常取集群总量的 80% 左右,留出冗余应对突发。
    Tlimit=QPScluster×0.8T_{limit} = QPS_{cluster} \times 0.8

AI 应用场景

电商大促秒杀系统流量保护

阶段:高并发架构设计

解决的问题:每年的双十一大促,秒杀接口瞬间涌入平时上百倍的流量,传统做法是盲目扩容,成本高且时效差。Sentinel 用热点参数限流精准拦截“超卖商品”的流量洪峰,用系统保护规则确保服务器负载不过载,同时配合熔断机制,防止秒杀系统异常拖垮整个下单链路。

具体案例:某电商平台在商品详情接口上配置了热点参数限流,指定商品 ID 作为第 0 个参数,单 ID 流量超过 500 QPS 即拒绝。大促当天,爆款商品的流量被成功控制在阈值内,其他长尾商品的请求完全不受影响,整体可用性保持在 99.99%。

第三方支付接口故障熔断降级

阶段:微服务治理

解决的问题:订单服务依赖外部支付网关,一旦支付网关响应变慢,订单服务的线程池会被大量占满,导致所有订单请求阻塞。Sentinel 的熔断机制在检测到支付调用异常比例升高后自动打开熔断器,快速返回“支付系统繁忙”的兜底响应,而不是让用户无限等待。

具体案例:某在线教育平台的支付网关在一个晚上出现 30% 的 5 秒超时,Sentinel 配置的熔断规则(异常比例超过 20% 即打开熔断器)在 10 秒内触发熔断,后续订单自动降级为“稍后支付”提示。20 分钟后网关恢复,半开状态探测成功,链路自动恢复正常,全程无人工干预。

数据库连接池系统保护

阶段:基础设施稳定性保障

解决的问题:当业务量激增时,数据库连接数会被快速打满,引发“连接池耗尽”的次生灾难。Sentinel 的线程数限流控制入口请求的最大并发线程数,防止大量请求同时去竞争数据库连接,从源头保护数据库。

具体案例:某社交应用的 feed 流服务配置了线程数限流(最大线程数 200),当热点事件引发流量暴增时,超出并发限制的请求被快速拒绝,数据库连接池始终维持在安全水位以下,服务端 RT 保持稳定,避免了级联故障。

Python 演示

python84 行
import time  class SlidingWindowLimiter:    """滑动窗口限流器: 统计最近window秒内的请求数, 超过max_qps则拒绝"""     def __init__(self, max_qps, window=1.0):        self.max_qps = max_qps        self.window = window        self._records = []     def try_acquire(self, now):        self._records = [t for t in self._records if t > now - self.window]        if len(self._records) >= self.max_qps:            return False        self._records.append(now)        return True  class CircuitBreaker:    """熔断状态机: CLOSED -> OPEN -> HALF_OPEN -> CLOSED"""     def __init__(self, failure_threshold=2, recover_seconds=0.8):        self.failure_threshold = failure_threshold        self.recover_seconds = recover_seconds        self._failure_count = 0        self._state = "CLOSED"        self._open_since = 0.0     def note_failure(self, now):        self._failure_count += 1        if self._state == "HALF_OPEN" or self._failure_count >= self.failure_threshold:            self._state = "OPEN"            self._open_since = now     def note_success(self):        self._failure_count = 0        if self._state == "HALF_OPEN":            self._state = "CLOSED"     def try_call(self, now):        if self._state == "OPEN":            if now - self._open_since >= self.recover_seconds:                self._state = "HALF_OPEN"                return True            return False        return True  def demo_limiter():    print("=== 滑动窗口限流演示 ===")    limiter = SlidingWindowLimiter(max_qps=3)    now = 0.0    for i in range(6):        now += 0.3        ok = limiter.try_acquire(now)        print("时刻%.1f秒 请求%d: %s" % (now, i + 1, "放行" if ok else "拒绝"))  def demo_breaker():    print("=== 熔断状态机演示 ===")    breaker = CircuitBreaker(failure_threshold=2, recover_seconds=0.8)    now = 0.0    for i in range(10):        now += 0.2        if not breaker.try_call(now):            print("时刻%.1f秒 请求%d: 被熔断拦截, 状态=%s" % (now, i + 1, breaker._state))            continue        if i in (2, 3):            breaker.note_failure(now)            print("时刻%.1f秒 请求%d: 业务失败, 状态=%s" % (now, i + 1, breaker._state))        else:            breaker.note_success()            print("时刻%.1f秒 请求%d: 正常通过, 状态=%s" % (now, i + 1, breaker._state))  def main():    demo_limiter()    print()    demo_breaker()  if __name__ == "__main__":    main()
目的:用两个极简类分别实现 Sentinel 的两大核心机制——滑动窗口限流器和熔断状态机。运行后可看到限流器如何拒绝突发流量,熔断器如何在“关闭 → 打开 → 半开 → 关闭”之间自动转换。
  1. self._records = [t for t in self._records if t > now - self.window]每次请求都先丢弃窗口之外的旧记录,实现窗口“滑动”效果
  2. if len(self._records) >= self.max_qps: return False窗口内计数达到阈值就拒绝新请求
  3. self._records.append(now)通过的请求把当前时刻记入窗口,供后续统计
  4. self._state = "OPEN"失败次数达到阈值后,熔断器进入打开状态,短路所有请求
  5. if now - self._open_since >= self.recover_seconds:打开状态持续满恢复时间后,自动进入半开状态
  6. self._state = "HALF_OPEN"半开状态允许少量探测请求通过,试探下游是否恢复
  7. if self._state == "HALF_OPEN": self._state = "CLOSED"探测请求成功,熔断器重新关闭,链路恢复正常

常见误区

误区很多初学者以为熔断就是降级,降级就是熔断,反正都是为了保护系统不崩溃,叫什么都行。

正解它们有本质区别。熔断是“电路故障自动跳闸”——下游接口出现大量异常时,熔断器自动切断链路,属于被动保护;降级是“停电时只保留照明”——提前制定好的备选方案,主动放弃次要功能保住核心功能。熔断发生后可以触发降级作为兜底,但降级并不一定要等熔断才执行。

为何常见:因为两者经常配合出现,都是为了处理“调用失败”的场景,而且效果上都是“返回一个兜底结果”,不深入看状态机和触发条件就很难分清。

误区以为配置了限流规则之后,所有超过阈值的请求都会被粗暴地拒绝,用户体验极差。

正解Sentinel 提供了多种流控效果。快速失败只是其中一种;Warm Up 模式在流量突然增长时平滑放宽阈值,让系统有时间完成缓存预热;排队等待模式则让超出的请求进入队列慢慢处理,削峰填谷。按业务场景选择合适的效果,可以做到“既限流又保体验”。

为何常见:因为最常见的限流表现就是“请求被拒绝”,初学者只见过快速失败这一种表现,就误以为限流等于丢请求。

误区觉得反正都是统计一段时间内的请求数,固定窗口每秒清零一次,实现简单效果也差不多。

正解固定窗口有著名的“临界突刺”问题:假设阈值 1000,第 59.9 秒到了 1000 个请求,第 60.0 秒窗口刚清零又来了 1000 个,实际 0.1 秒内放过了 2000 个请求。滑动窗口把时间切成小桶,窗口平滑滚动,任何时刻统计的都是“最近 1 秒”的真实区间,彻底堵住这个漏洞。

为何常见:这个误区源于对统计精度要求不高的小流量的经验,流量小的时候固定窗口和滑动窗口看起来差别不大,但到了高并发场景,零点几秒的误差就会被放大成雪崩。

误区认为熔断器一旦打开,所有请求就永远被拒绝,必须靠运维人员手动重启服务或重置状态。

正解Sentinel 设计的熔断状态机自带自动恢复机制。熔断器打开后经过配置的静默时间,会自动切换到半开状态,放少量探测请求去试探下游。如果探测成功就恢复关闭,失败就再次打开。整个过程无需人工介入,是“自愈”系统的一部分。

为何常见:人们容易类比生活中的保险丝——烧断后必须手动换新的。但 Sentinel 的熔断更像智能断路器,它会自己“合闸测试”,这也是它作为软件组件比物理保险丝更灵活的地方。

误区觉得上线前在配置文件里写好限流阈值,之后就不用再管了,反正规则一直在生效。

正解业务流量是动态变化的——大促、节假日、产品改版、扩缩容都会让系统容量发生改变。固定的阈值要么在流量低谷时造成误限流,要么在流量高峰时形同虚设。正确的做法是通过 Dashboard 持续监控,结合压测数据定期校准阈值,并通过规则持久化动态调整。

为何常见:因为静态配置最省事,而且很多系统在稳定期确实“感觉不到”规则需要调整。直到某次流量突增暴露问题,才发现阈值早已不合时宜。

面试题

Q1. Sentinel 的核心能力不包括以下哪一项?

单选题 · easy

  • A.限流
  • B.熔断
  • C.降级
  • D.服务注册← 正确答案

答案:D。Sentinel 是流量治理组件,核心能力是限流、熔断、降级和系统自适应保护。服务注册发现属于注册中心(如 Nacos、Eureka)的职责,不属于 Sentinel。想象游乐园调度中心只管人流治理,不管给新项目挂牌登记。

Q2. 滑动窗口相比固定时间窗口最核心的优势是什么?

单选题 · easy

  • A.实现更简单
  • B.消除临界突刺问题← 正确答案
  • C.不需要计数器
  • D.可以无限扩容

答案:B。固定窗口在窗口交界处会瞬间放过两倍流量,形成临界突刺。滑动窗口通过持续滚动的时间桶,让任意时刻统计的都是“最近”的真实区间,从根本上消除了这一漏洞。它是精度问题,不是性能或容量问题。

Q3. 熔断器的三个状态按照正常流转顺序排列正确的是?

单选题 · mid

  • A.关闭 → 打开 → 半开← 正确答案
  • B.打开 → 关闭 → 半开
  • C.半开 → 打开 → 关闭
  • D.关闭 → 半开 → 打开

答案:A。正常状态是关闭,故障触发后变打开,等待恢复时间后进入半开试探,探测成功回到关闭。可以类比设备正常运转 → 故障停机 → 试运行 → 恢复满负荷的循环。其他顺序都违背了“故障后先断再试探”的合理性。

Q4. 以下哪些指标可以触发 Sentinel 的降级规则?

多选题 · mid

  • A.异常比例← 正确答案
  • B.慢调用比例← 正确答案
  • C.异常数← 正确答案
  • D.请求体大小

答案:ABC。Sentinel 降级规则支持异常比例、慢调用比例和异常数三种指标来判断服务健康度。请求体大小不是降级指标,它更适合作为网关层参数限制的考量,不属于服务降级的统计维度。

Q5. 热点参数限流与普通限流的核心区别是什么?

单选题 · mid

  • A.热点限流只对 GET 请求生效
  • B.热点限流针对不同参数值单独统计和限制← 正确答案
  • C.热点限流不需要配置阈值
  • D.热点限流只能限流一个接口

答案:B。普通限流是对整个接口的总流量做统计,而热点参数限流会对接口中某个参数的每个取值单独统计,例如按商品 ID 分别计数。这样爆款商品的高流量不会挤占其他商品的额度,实现更精细的流量治理。

Q6. 熔断器处于半开状态时,系统会做什么?

单选题 · mid

  • A.放行全部请求进行测试
  • B.放行少量探测请求试探下游← 正确答案
  • C.直接报错拒绝所有请求
  • D.等待人工确认后再放行

答案:B。半开状态不允许放洪峰,只放行少量探测请求。如果这些探测请求成功,说明下游已恢复,熔断器转为关闭;如果失败,熔断器立即回到打开状态。就像设备检修后先让几个游客试乘,安全了才全面开放。

Q7. 以下关于 Sentinel 系统保护规则的说法正确的有?

多选题 · hard

  • A.只关注单个接口的 QPS
  • B.会综合系统负载和 CPU 使用率← 正确答案
  • C.入口线程数也是参考指标← 正确答案
  • D.达到阈值时限制入口流量← 正确答案

答案:BCD。系统保护站在整个应用的高度,综合监控系统负载、CPU 使用率、入口线程数和入口 QPS 等多个全局指标,过载时限制入口流量。它不针对单个接口,而是保护整个系统的稳定性,所以选项 A“只关注单个接口”不准确。

Q8. Warm Up 预热机制的主要目的是什么?

单选题 · hard

  • A.提高限流阈值的上限
  • B.避免系统冷启动时被流量冲垮← 正确答案
  • C.减少请求的响应时间
  • D.让规则在服务重启后消失

答案:B。系统刚启动时缓存未预热、资源未就绪,如果直接接受满负荷流量很容易被打垮。Warm Up 让限流阈值从较低值逐步增长到最终值,给系统一个“热身”时间。它不是提高上限,也不是优化响应时间,而是一种平滑过度的保护策略。

Q9. 降级策略中计算慢调用比例的分母是什么?

单选题 · easy

  • A.异常请求总数
  • B.窗口内总请求数← 正确答案
  • C.慢请求总数
  • D.队列长度

答案:B。慢调用比例指的是响应时间超过阈值的请求数占窗口内总请求数的比例。类比游乐园里“体验超时的游客占全部游客的比例”,分母必须是总请求数,而不是异常数或慢请求数本身。

Q10. 以下哪些属于 Sentinel 限流配置中的流控效果?

多选题 · mid

  • A.快速失败← 正确答案
  • B.Warm Up← 正确答案
  • C.排队等待← 正确答案
  • D.异步回调

答案:ABC。Sentinel 提供了快速失败、Warm Up 预热、排队等待三种流控效果,分别对应直接拒绝、平滑放宽阈值和削峰填谷。异步回调不属于流控效果,它是编程模型层面的响应处理方式,与流量控制是两码事。