Alibaba Sentinel熔断规则详解

Alibaba Sentinel熔断规则详解

简介

熔断是一种保护机制,用于防止系统在高负载或异常情况下继续承受过大的流量压力,从而导致系统崩溃或性能下降。熔断规则可以根据系统的负载情况自动触发熔断,将流量限制在一个可控范围内。

熔断策略-慢调用比例

结论:

在统计时长内的所有请求,如果请求时间超过xx秒(慢请求)的请求超过一定的比例,且请求数大于最小请求数,将触发熔断,效果是熔断时间内的请求会快速失败。经过熔断时间后,进入探测恢复状态,当下一个请求仍然是慢请求(请求时间超过xx秒),则再次进入熔断状态,不是则恢复正常状态。

流程图:

Alibaba Sentinel熔断规则详解

; 熔断结果

Alibaba Sentinel熔断规则详解

详细解释

Alibaba Sentinel熔断规则详解
  • 最大RT:
    • 请求最大响应时间,超过这个时间的请求为慢调用。RT是响应时间(reponse time)的意思,单位为毫秒。
  • 比例阈值:
    • 慢调用的比例,超过阈值触发熔断。取值范围0.0-1.0,代表 0% – 100%。(1.8.0 引入)
  • 熔断时长:
    • 熔断开始后,在这个时间内发出的请求会快速失败。单位为秒。
  • 最小请求数:
    • 请求数小于该值时,即使异常比率超出阈值也不会熔断。(1.7.0 引入)
  • 统计时长:
    • 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)

熔断策略-异常比例

结论:

在统计时长内的所有请求,如果异常的比例大于阈值,且请求数大于最小请求数,将触发熔断,效果是熔断时间内的请求会快速失败。经过熔断时间后,进入探测恢复状态,当下一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

详细解释

Alibaba Sentinel熔断规则详解
  • 比例阈值:
    • 异常的比例超过阈值触发熔断。取值范围0.0-1.0,代表 0% – 100% 。(1.8.0 引入)
  • 熔断时长:
    • 熔断开始后,在这个时间内发出的请求会快速失败。单位为秒。
  • 最小请求数:
    • 请求数小于该值时,即使异常比率超出阈值也不会熔断。(1.7.0 引入)
  • 统计时长:
    • 一个时间范围,可以是每1分钟、每3小时。根据这个时间内的请求,来统计总请求和数、计算慢调用比例。(1.8.0 引入)

      熔断策略-异常数

结论:

和异常比例策略是相差不大,比较的是异常数是否超过设置。

详细解释

Alibaba Sentinel熔断规则详解
  • 异常数:
    • 注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。

统计异常数、比例的方法

编码

为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:

Entry entry = null;
try {
entry = SphU.entry(resource);

} 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、访问数据库等,如果外部资源的响应时间过长或出现故障,可以设置熔断规则对这些资源进行保护。当资源的响应时间超过预设的阈值或出现错误时,熔断规则会触发,暂时停止对该资源的访问,以避免长时间等待或继续请求不可用的资源。
  • 防止雪崩效应:当系统整体的负载达到临界值时,可能会发生雪崩效应,即由于某个组件或服务的故障导致整个系统无法正常运行。为了避免雪崩效应,可以在系统各个关键组件之间设置熔断规则。当某个组件出现故障时,熔断规则会触发并限制对该组件的访问,以保护整个系统的稳定性。
  • 限流保护:熔断机制可以与限流机制结合使用,对系统的访问流量进行控制。当流量超过系统的处理能力时,可以设置熔断规则进行流量控制和限制。当流量超过预设的阈值时,熔断规则会触发并拒绝部分或全部的请求,以保护系统免受过载的影响。

通过合理设置熔断规则,可以提高系统的稳定性和可靠性,保护系统免受高负载和异常情况的影响。

关注“夏壹分享”发送“资源”获取238本进阶书籍和大厂面试Alibaba Sentinel熔断规则详解


原文始发于微信公众号(夏壹分享):Alibaba Sentinel熔断规则详解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155023.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!