文章目录
- 简介
- 熔断策略-慢调用比例
- 结论:
- 流程图:
- 熔断结果
- 详细解释
- 熔断策略-异常比例
- 结论:
- 详细解释
- 熔断策略-异常数
- 结论:
- 详细解释
- 统计异常数、比例的方法
- 编码
- 加注解
- RuntimeException
- 总结
简介
熔断是一种保护机制,用于防止系统在高负载或异常情况下继续承受过大的流量压力,从而导致系统崩溃或性能下降。熔断规则可以根据系统的负载情况自动触发熔断,将流量限制在一个可控范围内。
熔断策略-慢调用比例
结论:
在统计时长内的所有请求,如果请求时间超过xx秒(慢请求)的请求超过一定的比例,且请求数大于最小请求数,将触发熔断,效果是熔断时间内的请求会快速失败。
经过熔断时间后,进入探测恢复状态,当下一个请求仍然是慢请求(请求时间超过xx秒),则再次进入熔断状态,不是则恢复正常状态。
流程图:
熔断结果
详细解释
- 最大RT:
- 请求最大响应时间,超过这个时间的请求为慢调用。RT是响应时间(reponse time)的意思,单位为毫秒。
- 比例阈值:
- 慢调用的比例,超过阈值触发熔断。取值范围0.0-1.0,代表 0% - 100%。(1.8.0 引入)
- 熔断时长:
- 熔断开始后,在这个时间内发出的请求会快速失败。单位为秒。
- 最小请求数:
- 请求数小于该值时,即使异常比率超出阈值也不会熔断。(1.7.0 引入)
- 统计时长:
- 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)
- 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)
熔断策略-异常比例
结论:
在统计时长内的所有请求,如果异常的比例大于阈值,且请求数大于最小请求数,将触发熔断,效果是熔断时间内的请求会快速失败。
经过熔断时间后,进入探测恢复状态,当下一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
详细解释
- 比例阈值:
- 异常的比例超过阈值触发熔断。取值范围0.0-1.0,代表 0% - 100% 。(1.8.0 引入)
- 熔断时长:
- 熔断开始后,在这个时间内发出的请求会快速失败。单位为秒。
- 最小请求数:
- 请求数小于该值时,即使异常比率超出阈值也不会熔断。(1.7.0 引入)
- 统计时长:
- 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)
- 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)
熔断策略-异常数
结论:
和异常比例策略是相差不大,比较的是异常数是否超过设置。
详细解释
- 异常数:
- 注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。
统计异常数、比例的方法
编码
为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:
Entry entry = null;
try {
entry = SphU.entry(resource);
// Write your biz code here.
// <<BIZ CODE>>
} catch (Throwable t) {
if (!BlockException.isBlockException(t)) {
Tracer.trace(t);
}
} finally {
if (entry != null) {
entry.exit();
}
}
加注解
开源整合模块,如 Sentinel Dubbo Adapter, Sentinel Web Servlet Filter 或 @SentinelResource 注解会自动统计业务异常,无需手动调用。
- value:资源名称,必需项(不能为空)
- entryType:entry 类型,可选项(默认为 EntryType.OUT)
- blockHandler / blockHandlerClass: blockHandler对应处理 BlockException(熔断时抛出的异常)的函数名称,可选项(必须public)
- fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
// 类级别的注解,标识整个类作为一个资源
@SentinelResource(value = "exampleResource")
public class ExampleClass {
// 方法级别的注解,标识该方法作为一个资源
@SentinelResource(value = "exampleMethod")
public void exampleMethod() {
// 方法逻辑
}
// 配置降级处理方法
@SentinelResource(value = "exampleResource", blockHandler = "handleBlock")
public void exampleMethodWithBlockHandler() {
// 方法逻辑
}
// 降级处理方法,用于处理资源保护触发时的逻辑
public void handleBlock(BlockException ex) {
// 降级处理逻辑
}
}
RuntimeException
无论是否使用@SentinelResource注解,抛出的RuntimeException都会被计算为异常数。
总结
-
服务调用保护:
在分布式系统中,一个服务通常会依赖其他的服务进行调用。当依赖的服务出现故障或异常时,为了避免故障扩散,可以对该服务的调用进行熔断。如果调用次数超过预设的阈值,熔断规则将会触发,并且暂时停止对该服务的调用,以防止对系统产生过大的压力。 -
外部资源保护:
在与外部资源交互的场景中,例如调用第三方API、访问数据库等,如果外部资源的响应时间过长或出现故障,可以设置熔断规则对这些资源进行保护。当资源的响应时间超过预设的阈值或出现错误时,熔断规则会触发,暂时停止对该资源的访问,以避免长时间等待或继续请求不可用的资源。 -
防止雪崩效应:
当系统整体的负载达到临界值时,可能会发生雪崩效应,即由于某个组件或服务的故障导致整个系统无法正常运行。为了避免雪崩效应,可以在系统各个关键组件之间设置熔断规则。当某个组件出现故障时,熔断规则会触发并限制对该组件的访问,以保护整个系统的稳定性。 -
限流保护:
熔断机制可以与限流机制结合使用,对系统的访问流量进行控制。当流量超过系统的处理能力时,可以设置熔断规则进行流量控制和限制。当流量超过预设的阈值时,熔断规则会触发并拒绝部分或全部的请求,以保护系统免受过载的影响。
通过合理设置熔断规则,可以提高系统的稳定性和可靠性,保护系统免受高负载和异常情况的影响。