Sentinel断路器与熔断降级

Stella981
• 阅读 328

前言

Sentinel的熔断降级通过断路器实现,本文通过介绍熔断器的定义、如何构建熔断器、断路器校验逻辑、断路器状态转换、异常/慢调用熔断流量是如何统计等方面梳理断路器的工作原理和实现方式。 

一、断路器定义

Sentinel中的熔断降级使用断路器实现,先看下断路器概念,来自维基百科的定义:

断路器有分简单与较进阶的版本,简单的断路器只需要知道服务是否可用。而较进阶的版本比起前者更有效率。进阶的断路器带有至少三个状态:

说明:从概念中可以看出断路器的关键点在于统计流量与三种状态的转换。

二、构建断路器

我们通过DegradeRuleManager.loadRules或者getProperty().updateValue使降级规则生效时,会将DegradeRule转换为断路器CircuitBreaker。

Sentinel断路器与熔断降级

断路器由两类构成,慢调用使用ResponseTimeCircuitBreaker,异常数和异常比例使用ExceptionCircuitBreaker。

Sentinel断路器与熔断降级

断路器类图

Sentinel断路器与熔断降级

三、断路器校验

DegradeSlot负责熔断规则的校验,tryPass方法执行具体的判断。

Sentinel断路器与熔断降级

判断的逻辑

如果熔断器状态为关闭,则返回true,即允许请求通过。

如果熔断器状态为开启,并且已经超过熔断时长以及开启状态成功转换为半开启(探测)状态,则返回true,即允许请求通过。

如果熔断器状态为开启,并且还在熔断时长内,则返回false,禁止请求通过。

Sentinel断路器与熔断降级

那探测和开启状态都允许请求通过,在“熔断降级说明”文章中知道,探测状态只允许一个请求通过,这个是在哪里控制的呢?

四、断路器状态转换

在调用Entry#exit()时,会触发插槽链条的退出调用。具体到熔断降级DegradeSlot#exit方法。通过circuitBreaker.onRequestComplete回调熔断器执行状态切换。

Sentinel断路器与熔断降级

1.异常熔断器状态转换

 

ExceptionCircuitBreaker负责异常数/异常比例的熔断,通过滑动窗口统计发生错误数及请求总数。

Sentinel断路器与熔断降级

详细熔断逻辑

Sentinel断路器与熔断降级

2.慢调用熔断器状态转换

 

ResponseTimeCircuitBreaker负责慢调用的熔断,通过滑动窗口统计慢调用数量及总的请求数。

Sentinel断路器与熔断降级

详细熔断逻辑

Sentinel断路器与熔断降级

五、滑动窗口流量统计

1.异常熔断流量统计

 

异常熔断ExceptionCircuitBreaker的流量统计通过SimpleErrorCounterLeapArray实现,默认采样窗口sampleCount为1,统计区间intervalInMs为1秒。

Sentinel断路器与熔断降级

Sentinel断路器与熔断降级

2.慢调用熔断流量统计

 

慢调用熔断ResponseTimeCircuitBreaker的流量统计通过SlowRequestLeapArray实现,默认采样窗口sampleCount为1,统计区间intervalInMs为1秒。

Sentinel断路器与熔断降级

Sentinel断路器与熔断降级

说明:具体滑动窗口的统计逻辑见文章“Sentinel基于滑动窗口的流量统计【源码笔记】”。


作者介绍:;梁勇,哈罗出行高级技术专家,负责服务框架和消息平台,专注后端中间件方向,公众号“瓜农老梁”维护者。

       Sentinel断路器与熔断降级

本文分享自微信公众号 - 中间件兴趣圈(dingwpmz_zjj)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
红烧土豆泥 红烧土豆泥
2年前
太刺激了,太刺激了,记录一下新版SpringCloud集成Feign和hystrix做服务熔断遇到的坑
太刺激了,太刺激了,熬了一个晚上,终于发现了服务熔断无效不是我的错,而是在SpringCloud的新版中,对断路器配置上有了变动;作者此处所使用的SpringCloud和SpringBoot版本为ReleaseTrainVersion:2020.0.3;SupportedBootVersion:2.4.6。如果比较急,可以跳过前文的扯淡环节,
Stella981 Stella981
2年前
Spring cloud 超时及重试配置【ribbon及其它http client】
开启重试在某些情况下是有问题的,比如当压力过大,一个实例停止响应时,路由将流量转到另一个实例,很有可能导致最终所有的实例全被压垮。说到底,断路器的其中一个作用就是防止故障或者压力扩散。用了retry,断路器就只有在该服务的所有实例都无法运作的情况下才能起作用。这种时候,断路器的形式更像是提供一种友好的错误信息,或者假装服务正常运行的假象给使用者。不
Stella981 Stella981
2年前
Spring Cloud 与 Dubbo 区别
 DubboSpringCloud服务注册中心      ZookeeperSpringCloudNetflixEureka服务调用方式RPC          RESTAPI服务监控DubbomonitorSpringBootAdmin断路器不完善SpringCloudNetfli
Easter79 Easter79
2年前
SpringCloud 教程 (五) 断路器监控(Hystrix Dashboard)
一、HystrixDashboard简介在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。HystrixDashboard是作为断路器状态的一个组件,提供了数据监控和友好的图形化界面。二、准备工作
Easter79 Easter79
2年前
SpringCloud 进阶之Hystrix(断路器)
1\.Hystrix断路器Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性;"断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断
Stella981 Stella981
2年前
Sentinel 流量控制 熔断降级 初探
    还记得之前写过一篇防雪崩利器:熔断器Hystrix的原理与使用https://my.oschina.net/u/3266761/blog/2654470,讲述了服务降级和熔断的控制,今天带来另一个流量控制与服务降级阿里开源框架sentinel。  首先是两者的对比:    Hystrix的关注点在于以隔离和熔断为主的容错机制
Stella981 Stella981
2年前
Hystrix断路器是如何工作的
前言20181130,Hystrix已经不再维护,这里是学习记录。12月1日才完成,没有完成11月的诺言,捐款记录以上动弹。https://my.oschina.net/floor/tweet/19421296(https://my.oschina.net/floor/tweet/19421296)Hystrix是什么
Easter79 Easter79
2年前
SpringCloud介绍
自己通俗的理解只能是Http协议调用,Dubbo可以支持多种协议就是RPC远程调用就是提供服务注册,服务发现,断路器,网关系统和自动配置的工具,底层采用http协议实现采用Eureka注册中Ribbon实现负载均衡Feignhttp协议调用工具Hystrix断路器Zuul网关系统就是把API服务通过注册中心