K8s

分布式组件-Sentinel-Dashboard常规操作

2021-03-13  本文已影响0人  乙腾

Sentinel资源保护规则

Sentinel支持多种保护规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则、热点参数规则。

流控

image.png

阈值类型

QPS(Queries Per Second)

表示每秒的查询数,也就是一台服务器每秒能够响应的查询次数。当QPS达到限流的阈值时,就会触发限流策略。

并发线程数

并发线程数限流用来保护业务线程不被耗尽。比如,A服务调用B服务,而B服务因为某种原因导致服务不稳定或者响应延迟,那么对于A服务来说,它的吞吐量会下降,也意味着占用更多的线程(线程阻塞之后一直未释放),极端情况下会造成线程池耗尽。

针对这种问题,一个常见的解决方案是通过不同业务逻辑使用不同的线程池来隔离业务自身的资源争抢问题,但是这个方案同样会造成线程数量过多带来的上下文切换问题。

Sentinel并发线程数限流就是统计当前请求的上下文线程数量,如果超出阈值,新的请求就会被拒绝。

QPS流控行为

image.png

当QPS超过阈值时,就会触发流量控制行为,这种行为是通过controlBehavior来设置的,它包含:

• 直接拒绝(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);

• Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP),冷启动(预热);

• 匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);

• 冷启动+匀速排队(RuleConstant.CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER)。直接拒绝

直接拒绝

是默认的流量控制方式,也就是请求流量超出阈值时,直接抛出一个FlowException。

Warm Up

Warm Up是一种冷启动(预热)方式。当流量突然增大时,也就意味着系统从空闲状态突然切换到繁忙状态,有可能会瞬间把系统压垮。当我们希望请求处理的数量逐步递增,并在一个预期时间之后达到允许处理请求的最大值时,Warm Up就可以达到这个目的。

image.png

QPS阈值为10,预热时间为10s,当请求大量大量涌入时候,系统并不是直接将QPS拉到最大值,而是在一定时间内逐步增加阈值,而中间这段时间就是一个系统逐步预热的过程。

image.png
应用

如果一个秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值

排队等待

排队等待也叫匀速排队,这种方式会严格控制请求通过的间隔时间,也就是让请求以均匀的速度通过,其实相当于前面讲的漏桶限流算法。

image.png

每秒请求10次,如果超过则排队等待0.5秒(超时时间单位:毫秒)

notice:

排队等待只有和阈值类型为QPS搭配使用才有效。

调用关系流控策略

调用关系包括调用方和被调用方,一个方法又可能会调用其他方法,形成一个调用链。所谓的调用关系流量策略,就是根据不同的调用维度来触发流量控制。

• 根据调用方限流。

• 根据调用链路入口限流。

• 具有关系的资源流量控制(关联流量控制)。

根据调用方限流

根据请求来源进行流量控制,我们需要设置limitApp属性来设置来源信息,它有三个选项。

• default:表示不区分调用者,也就是任何访问调用者的请求都会进行限流统计。

• {some_origin_name}:设置特定的调用者,只有来自这个调用者的请求才会进行流量统计和控制。

• other:表示针对除{some_origin_name}外的其他调用者进行流量控制。

由于同一个资源可以配置多条规则,如果多个规则设置的limitApp不一样,那么规则的生效顺序为:{some_origin_name}→other→default。

image.png

关联限流

用于限制两个有竞争资源的请求,当一方流量大的时候,来限制另一方的访问。

有当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢,举例来说,read_dbwrite_db 这两个资源分别代表数据库读写,我们可以给 read_db 设置限流规则来达到写优先的目的。

image.png

链路限流

一个被限流保护的方法,可能来自不同的调用链路。比如针对资源nodeA,入口Entrance1和入口Entrance2都调用了资源nodeA,那么Sentinel允许只根据某个入口来进行流量统计。比如我们针对nodeA资源,设置针对Entrance1入口的调用才会统计请求次数。它在一定程度上有点类似于调用方限流。

image.png

熔断

image.png

Sentinel 提供以下几种熔断策略

慢调用比例

根据单位时间内响应时间超长的比例设置熔断。

image.png

如图慢调用RT=2ms,比例阈值(取值范围【0.0,1.0】)20%,熔断时长30s,最小请求数20,统计时长10s。

在统计时间10s内,触发熔断的条件为,只要有请求RT>2ms的次数超过4(20*0.2)个就触发熔断,熔断时间为30s。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

熔断时后台报错

com.alibaba.csp.sentinel.slots.block.degrade.DegradeException
2021-03-13 10:16:17.042  WARN 21948 --- [nio-9090-exec-1] c.p.g.I.sentinel.fallback.OrderFallback  : Invoke testSentinelFallback: com.alibaba.csp.sentinel.slots.block.degrade.DegradeException
2021-03-13 10:16:17.042  INFO 21948 --- [nio-9090-exec-1] c.p.g.I.sentinel.fallback.OrderFallback  : 进入testSentinelFallback,输入参数》》》xxxx

调用fallback

image.png

notice:

慢调用1.8以上版本暂时使用有错误,无法创建规则。

异常比例

根据单位时间内请求异常比例进行熔断

image.png

当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

异常数

根据单位时间内请求异常数进行熔断

image.png

热点规则

image.png image.png
@PostMapping("/testSentinel")
@SentinelResource(value = "testSentinel",fallback = "testSentinelFallback",fallbackClass = OrderFallback.class,blockHandler = "testSentinelFallback",blockHandlerClass = OrderBlockHandler.class)
public ResponseResult testSentinel(String args,String parmas) throws InterruptedException {
    return new ResponseResult<>(ErrorCodeEnume.SUCCESS.getCode(), ErrorCodeEnume.SUCCESS.getMsg());
}

设置规则为:对/testSentinel请求中包括args参数(参数索引0)的请求进行限流,还可以通过参数例外项对args指定的参数值进行限流。如果有多个参数可以设置多个热点规则,但是对于参数是json的就不支持了。参数类型只是基础类型。

设置黑白名单

image.png image.png
上一篇下一篇

猜你喜欢

热点阅读