主流限流熔断组件对比
Sentinel
Sentinel 是一款面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障服务的稳定性,核心思想是:根据对应资源配置的规则来为资源执行相应的流控/降级/系统保护策略,Sentinel 的主要特性如下图
官方文档地址:https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0
资源与规则:
Sentinel 可以简单分为 Sentinel 核心库和 Dashboard,核心库不依赖 Dashboard,但是结合 Dashboard 可以获得更好的效果。使用 Sentinel 来进行资源保护,主要分为几个步骤:
(1)定义资源:资源可以是程序中的任何内容,例如一个服务,服务里的方法,甚至是一段代码。
(2)定义规则:Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。
(3)检验规则是否生效
由于 Sentinel 中所有的规则都可以在动态地查询和修改,并且修改后立即生效,并且 Sentinel 中资源定义和规则的配置是分离的。因此在编码时,我们先把需要保护的资源定义好(埋点),之后便可以在需要的时候动态配置规则了。也可以理解为,只要有了资源,我们就能在任何时候灵活地定义各种规则。
定义资源:
对于资源的定义有两种,一种是硬编码的方式,一种是通过 @SentinelResource 注解的方式。
定义规则:
Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。而定义规则同样支持两种方式:一种是硬编码的方式,一种是通过 sentinel-dashboard 控制台直接配置
流量控制规则
流量控制,原理是监控应用流量的 QPS 或 并发线程数 等指标,当达到指定阈值时对流量进行控制,避免系统被瞬时的流量高峰冲垮,保障应用高可用性。同一个资源可以创建多条限流规则,一条限流规则由以下属性组成:
-
resource:资源名,即限流规则的作用对象,默认请求路径。
-
limitApp:流控针对的调用来源,若为 default 则不区分调用来源,默认值default
-
count:限流阈值
-
grade:限流阈值类型(1代表 QPS,0 代表并发线程数),默认值QPS
-
strategy:流控模式
直接拒绝(默认):接口达到限流条件时,
直接限流 关联:当关联的资源达到阈值时,就限流自己(适合做应用让步)
链路:只记录指定链路上的流量,指定资源从入口资源进来的流量,如果达到阈值,就可以限流
⑥ controlBehavior:流控效果
快速失败(默认):当 QPS 超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException
排队等待:这种方式严格控制了请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。
WarmUp:该方式主要用于系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮的情况。预热底层是根据令牌桶算法实现的。
熔断降级规则
sentinel 提供了以下几种荣熔断策略:
(1)平均响应时间 :
DEGRADE_GRADE_RT,当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源会进入降级状态,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。
(2)异常比例 :
DEGRADE_GRADE_EXCEPTION_RATIO,当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
(3)异常数 :
DEGRADE_GRADE_EXCEPTION_COUNT,当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
参考资料:https://blog.csdn.net/a745233700/article/details/122733366