alibaba的熔断器组件,用于服务熔断降级
微服务时代,各个微服务之间相互调用,如果有单个服务出现问题,整个服务可能会出现雪崩
sentinel中的基本概念
1、资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
2、规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
从sentinel的面板看 有这些规则可以设置
比较常用的就是流控和熔断
什么是流量控制?
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制
流量控制有以下几个角度:
资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
运行指标,例如 QPS、线程池、系统负载等;
控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
什么是熔断降级
当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。
监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值对流量进行控制,避免被瞬时的高流量冲垮,保证应用的高可用性
资源名:默认是请求路径
针对来源:对哪个微服务进行限流,默认default即不区分来源
QPS:调用该接口的QPS达到阈值的时候进行限流
线程数:当调用该接口的线程数达到阈值的时候进行限流
流控模式:
sentinel有三种流控模式:
1、直接:接口达到限流条件时,开启限流
2、关联:当关联的资源达到限流条件时,开启限流(适合做应用让步)
例1:两个资源之间具有资源争抢或者依赖关系,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写的速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。
例2:下订单和支付接口,支付接口故障,需要在下订单时就限流失败
3、链路:当从某个接口过来的资源达到限流条件时,开启限流
例:/trace2接口中调用了资源tranceService 设置如下 则调用/trace2时会有流控效果
流控效果:
1、快速失败:直接失败,抛出异常
2、warm up:从开始阈值到最大QPS阈值有一个缓冲阶段,一开始的阈值时最大QPS阈值的1/3,然后慢慢增长,知道最大阈值
3、排队等待:让请求以均匀的速度通过
降级规则即满足条件时对服务进行降级,sentinel提供三个衡量条件
慢调用比例
选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值统计为慢调用。当单位统计时长内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会被再次熔断
案例:
上面配置的熔断规则的意思是:如果在【1000】ms内,请求数超过【1】,响应时间超过【900】ms的请求比例大于【0.1】,则熔断10s,接下来的10s内都不会调用真实方法,走降级方法
异常比例
当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成则结束熔断,否则会再次被熔断。
异常比例的阈值范围是[0.0,1.0],代表0% - 100%
异常数
当单位统计时长内的异常数目超过阈值后自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态。若接下来的一个请求成功完成,则结束熔断,否则会再次被熔断。
热点是经常访问的数据,很多时候希望统计某个热点数据中访问频次最高的top k数据,并对其访问进行限制