Sentinel限流熔断与生产排查面试题
本页只保留面试标准回答、常见追问和精确原理跳转。第一次学习请先阅读Sentinel基础和Sentinel内部原理与生产治理。
1. Sentinel的核心原理是什么
标准回答: Sentinel把接口、方法和远程调用抽象为Resource。请求进入资源时,CtSph创建Entry并进入按资源缓存的SlotChain;链先构建Context调用节点,再通过滑动窗口统计QPS、并发、RT和异常,随后由Authority、System、Flow和CircuitBreaker等Slot判断是否放行。通过后执行业务,退出时记录RT和完成结果;阻断则抛出BlockException。
2. Context、Entry、DefaultNode和ClusterNode有什么区别
标准回答: Context表示稳定调用入口和当前Entry栈;Entry表示一次资源调用;DefaultNode统计资源在某个Context路径下的数据;ClusterNode聚合同一JVM内该资源跨Context的数据。ClusterNode不是跨机器集群统计,跨实例总配额需要集群流控或统一网关。
原理:核心对象、Context与节点树
3. Sentinel滑动窗口是怎样实现的
标准回答: LeapArray把统计周期等分成固定数量桶,用时间除以桶长得到时间编号,再对数组长度取模定位环形槽位。槽位为空时CAS创建;仍属于当前窗口时复用;已过期时加锁清空并重置。查询指标只聚合仍在统计周期内的有效桶,因此空间固定且比整秒固定窗口更平滑。
4. StatisticSlot排在FlowSlot前,为什么不会把被限流请求算成通过
标准回答: StatisticSlot先调用后续 fireEntry()。若后续规则抛BlockException,它记录block并继续抛出;只有后续检查全部通过,才增加pass和当前线程数。业务退出时再记录RT、成功、异常并减少线程数,这是洋葱式调用,不是简单从上到下先计数再判断。
5. QPS限流和并发线程数限流怎样选择
标准回答: 快接口、风险主要来自吞吐突增时使用QPS;慢接口、导出和外部调用更应关注并发,因为并发约等于QPS乘平均耗时。并发规则能限制尚未退出的请求数,但不会配置HTTP连接和读取超时,也不是独立线程池。
6. Warm Up解决什么问题
标准回答: Warm Up用于系统冷启动时逐步把通过速率从较低水平提升到目标阈值,给JIT、缓存、连接池和依赖预热时间。它不处理依赖故障,也不能替代熔断、客户端超时和容量隔离。
原理:Warm Up与匀速排队
7. Sentinel匀速排队是不是内置消息队列
标准回答: 不是。匀速控制器根据目标速率计算期望通过时间,若等待不超过最大排队时间,就让当前调用线程sleep或park;超时则拒绝。它不持久化、不支持进程崩溃恢复,还会占用调用线程。长时间削峰和必须不丢的任务应使用消息队列。
原理:匀速排队内部行为
8. 熔断器怎样从OPEN恢复
标准回答: CLOSED状态达到最小请求数且慢调用或异常指标超过阈值后,通过CAS转OPEN并设置下次探测时间。到期后通常只有一个请求抢到OPEN到HALF_OPEN的CAS并被放行探测;探测成功转CLOSED并重置统计,失败则重新OPEN,其余请求不会在到期瞬间全部放行。
原理:熔断状态机
9. 业务异常为什么没有触发Sentinel熔断
标准回答: 业务异常必须被记录到当前Entry才会进入异常统计。注解或框架适配器通常会Trace异常;手工SphU.entry时需要显式记录;若业务catch后返回正常对象、异常发生在未关联的异步线程,或配置了exceptionsToIgnore,异常比例都可能保持为0。
原理:业务异常统计边界
10. blockHandler和fallback有什么区别
标准回答: blockHandler处理FlowException、DegradeException等Sentinel规则阻断,意味着业务通常未执行;fallback处理符合配置的业务Throwable或调用失败。二者签名必须与原方法和异常参数匹配。支付、库存写操作无论哪种情况都不能返回伪成功,应返回失败或UNKNOWN并查询事实。
11. Dashboard挂了,Sentinel是否立即失效
标准回答: 通常不会。每次请求的规则判断在应用本地数据面完成,本地已加载规则仍可工作。但Dashboard机器发现、实时查看、临时推送和运维入口会受影响;若生产规则只存在Dashboard或客户端内存,重启后可能丢失,所以应使用配置中心作为持久化事实来源。
12. Sentinel规则动态更新是强一致的吗
标准回答: 不是。每个客户端独立监听配置并更新本地RuleManager;不同实例、不同规则类型和代码版本可能短暂不一致。单次更新通常重建本地规则索引并替换,但不构成跨实例、跨Flow/Degrade/System规则的原子事务。生产要做版本、校验、灰度、实例收敛检查和回滚。
原理:规则热更新
13. 本地流控与集群流控有什么区别
标准回答: 本地流控由每个JVM用自己的滑动窗口判断,延迟低且无远程依赖,但多实例总配额会随实例数和负载分布变化。集群流控由Token Client向Token Server申请全局Token,可以控制总配额,但新增网络延迟和Token Server故障域,必须设计超时、高可用和失败回退。
原理:本地与集群流控
13.1 Sentinel系统规则解决什么
标准回答: 系统规则保护的是整台应用实例,不是某一个接口。它会根据CPU、Load、入口QPS、总线程数、平均RT等整体指标决定是否拒绝新请求。它适合作为最后兜底,但粒度较粗,不能替代接口级限流、热点参数、线程池隔离和下游熔断。否则一个导出接口打满CPU时,系统规则可能把核心下单接口也拦住。
原理:系统规则、SystemSlot
13.2 集群流控的Token Server挂了怎么办
标准回答: 要提前定义失败策略。普通查询可短时间Fail-open并启用本地保守阈值;短信、验证码、第三方硬额度接口更偏Fail-closed或降级排队;支付、库存这类写链路不能靠流控决定成功,必须返回失败或UNKNOWN并按业务状态机处理。Token Server本身要高可用、低超时、可观测,并通过演练验证故障行为。
14. 服务从4台扩到8台,Sentinel阈值会怎样
标准回答: 如果每实例都配置100 QPS的本地规则,理论集群上限会从约400提高到约800 QPS,Sentinel不会自动保证原来的全局400不变。若下游容量没扩,扩容反而可能打垮下游。应使用网关或集群总配额,或由发布平台根据健康实例数和安全容量动态计算每实例阈值。
原理:滑动统计不是全局配额、商业容量计算
15. 为什么不能把订单号拼进Sentinel资源名
标准回答: 资源名会参与ResourceWrapper、SlotChain、节点和指标管理。订单号是高基数动态值,会持续创建资源和统计结构,造成内存与指标膨胀;达到内部链缓存上限后,新资源还可能不再正常经过规则链。应使用稳定模板资源名,把订单号留在业务参数或Trace中。
原理:核心对象与资源基数
16. 热点参数限流与接口QPS限流有什么区别
标准回答: 接口QPS限制资源总流量;热点参数规则按指定参数值维护独立统计,例如只限制爆款SKU或异常租户。它能缓解局部热点,但不能自动解决Redis热Key、数据库热点行和分片倾斜,高基数参数还会增加统计缓存成本。
原理:热点参数限流
17. Sentinel与Feign超时、重试是什么关系
标准回答: Sentinel决定本次调用是否允许尝试并统计结果,不负责Socket连接和读取超时。Feign底层HTTP客户端必须配置物理超时;重试应受总Deadline和幂等约束。多层重试会放大物理Attempt,并改变熔断器看到的是每次尝试还是最终结果,必须结合装饰顺序、Trace和指标验证。
原理:Feign调用链
18. CompletableFuture中为什么Sentinel RT只有几毫秒
标准回答: 很可能在请求线程提交任务后就退出了普通Entry,统计到的只是提交耗时。Context主要绑定线程,不会自动传播。应使用AsyncEntry,在异步完成回调中记录错误并exit;Reactor则使用匹配版本的适配器和上下文机制。
原理:异步上下文
19. Sentinel大量FlowException怎样排查
标准回答: 先按异常类型确定是Flow、Degrade、ParamFlow、System还是Authority;再按实例和资源核对规则版本、QPS、pass/block、线程数、RT、异常、热点参数、扩缩容与重试。确认请求是否到达业务和下游。错误规则先版本回滚;真实过载则保护核心链路、停止异常重试并处理下游容量,不能只调大阈值。
原理:生产Runbook
20. Sentinel、Gateway限流、线程池隔离和MQ怎样选
标准回答: Gateway适合入口、租户和路由级统一限流;Sentinel适合应用内资源、调用链、热点参数和熔断;线程池或Bulkhead隔离限制并发资源占用;MQ负责可持久化异步削峰。它们解决的问题不同,可以组合,但必须统一Deadline、重试、错误码和容量预算,避免多层规则互相误伤。
