Sentinel 支持哪些流控规则和降级规则?
Alibaba Sentinel 是一款面向分布式服务架构的高可用防护组件。它提供了非常丰富且灵活的流控(Flow Control)和降级/熔断(Degradation/Circuit Breaking)规则。
以下是 Sentinel 支持的流控规则和降级规则的详细解析:
一、 流控规则(Flow Rules)
流控的核心目的是防止系统被突发的流量压垮。Sentinel 从阈值类型、流控模式和流控效果三个维度来配置流控规则。
1. 阈值类型(Limit Type)
- QPS(每秒请求数): 当调用该 API 的 QPS 达到阈值时,进行限流。这是最常用的限流方式。
- 并发线程数(Thread Count): 当调用该 API 的并发线程数达到阈值时,进行限流。用于保护业务线程池不被耗尽(类似隔离的作用),特别适合响应时间不稳定的长链路调用。
2. 流控模式(Flow Control Mode - 针对调用链路)
- 直接(Direct): 默认模式。直接对当前资源进行限流。当该资源的流量达到阈值时,直接触发限流。
- 关联(Relational): 当关联资源的流量达到阈值时,限流当前资源。
- 应用场景: 比如数据库的“写”操作非常消耗性能。当“写”接口的 QPS 超过阈值时,限制“读”接口的流量,以保护数据库。
- 链路(Chain): 根据调用链路入口进行限流。只有从指定的入口访问当前资源的请求,才会被统计并限流。
- 应用场景: 接口 A 和接口 B 都调用了底层的服务 C。可以通过链路模式,专门限制从入口 A 进来的对 C 的调用,而不影响入口 B。
3. 流控效果(Flow Control Effect - 流量整形)
当流量达到阈值后,Sentinel 采取什么样的处理方式:
- 快速失败(Fast Fail/Reject): 默认效果。达到阈值后,新的请求会被立即拒绝,抛出
FlowException。适用于对处理时间有严格要求的场景。 - 预热(Warm Up): 基于“令牌桶”算法的变体。当系统长期处于低水位时,如果突然来了一波大流量,直接放行可能会把系统压垮。预热模式会让放行的 QPS 阈值从一个较小的值(默认是
最大QPS / 3)在设定的预热时间内逐渐增加到最大 QPS。- 应用场景: 秒杀系统、需要预热缓存或建立数据库连接的系统。
- 排队等待(匀速排队 / Queueing): 基于“漏桶”算法。严格控制请求通过的间隔时间,让请求以均匀的速度通过。如果当前请求处理不过来,后面的请求会在队列中排队等待,直到超时(抛出异常)。
- 应用场景: 处理突发流量(削峰填谷),例如消息队列的消费者,希望以固定的速率处理消息,而不是直接拒绝。
二、 降级/熔断规则(Degrade Rules)
降级的核心目的是当某个依赖的资源出现不稳定(慢调用或频繁异常)时,暂时切断对该资源的调用(熔断),避免引起雪崩效应。
(注:Sentinel 1.8.0 版本对熔断降级功能进行了重构,引入了标准的熔断器状态机:Closed, Open, Half-Open)
Sentinel 支持以下三种熔断策略:
1. 慢调用比例(Slow Request Ratio)
- 原理: 当请求的响应时间(RT)大于指定的最大 RT(最大响应时间),该请求被记为“慢调用”。
- 触发条件: 在统计窗口期内,如果总请求数大于设定的最小请求数(Min Request Amount),并且慢调用的比例大于设定的阈值,则触发熔断。
- 恢复: 熔断时间结束后,状态变为半开(Half-Open)。放行下一次请求,如果该请求的响应时间仍然大于最大 RT,则继续熔断;如果正常,则恢复闭合状态(Closed)。
2. 异常比例(Error Ratio)
- 原理: 根据请求抛出业务异常的比例来熔断。
- 触发条件: 在统计窗口期内,总请求数大于最小请求数,并且异常比例(比如 50%)大于设定的阈值,则触发熔断。
- 恢复: 与慢调用比例类似,熔断时长结束后进入半开状态,探测下一个请求是否抛出异常。
3. 异常数(Error Count)
- 原理: 根据请求抛出业务异常的绝对数量来熔断。
- 触发条件: 在统计窗口期内,发生异常的总次数大于设定的阈值,则直接触发熔断。
- (注意:由于统计窗口默认是分钟级或秒级,如果时间窗口设置不到位,异常数策略可能不如异常比例敏感)
三、 补充:Sentinel 的其他核心规则
除了流控和降级,Sentinel 实际上还支持以下三种强大的规则,通常配合使用:
- 热点参数限流规则(Param Flow Rule):
专门针对带有参数的接口。例如根据请求的userId或商品ID进行限流,防止某个大客户或热门商品瞬间把系统打挂。(基于 LRU 策略统计)。 - 系统保护规则(System Rule):
从整体应用级别的维度进行保护,而不是针对某一个具体的 API。支持根据系统的 Load(系统负载)、CPU 使用率、全局入口 QPS、全局并发线程数、全局平均 RT 等指标进行全局拦截。 - 授权规则(Authority Rule):
也叫黑白名单机制。可以根据请求的来源(Origin,如特定的微服务名称、IP 等)来决定是否允许访问该资源。