熔断与雪崩
上游服务切断或减缓对下游服务的访问。
熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。牺牲局部,保全整体的措施就叫做熔断
。
假设当前系统中有A,B,C三个服务,服务A是上游,服务B是中游,服务C是下游。一旦下游服务C因某些原因变得不可用,堆积大量的请求,服务B的请求线程也随之阻塞。线程资源逐渐耗尽,使得服务B也变得不可用。紧接着,服务A也变为不可用,整个调用链路被拖垮。这种调用链路的连锁故障叫做雪崩
。
服务熔断是应对雪崩效应的一种微服务链路保护机制。例如在高压电路中,如果某个地方的电压过高,熔断器就会熔断,对电路进行保护。同样,在微服务架构中,熔断机制也是起着类似的作用。当调用链路的某个微服务不可用或者响应时间太长时,会进行服务熔断,不再有该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
一种简单的思路
用单位时间内总请求数与成功或失败请求数之比来确定是否熔断,单位时间请求次数的计算可以使用粒度较小的滑动窗口
。熔断的状态可以有open、half-open或closed,当消耗完堆积的请求后,就可以调整成closed状态,进行正常的服务。
熔断算法与框架
Google sre弹性熔断算法:https://sre.google/sre-book/handling-overload/#eq2101
Google sre弹性熔断算法的实践:
bilibili kratos:https://github.com/go-kratos/kratos/tree/v1.0.x/pkg/net/netutil/breaker
go-zero:https://github.com/zeromicro/go-zero/tree/master/core/breaker
Hystrix:https://github.com/Netflix/Hystrix
hystrix-go:https://github.com/afex/hystrix-go
gobreaker:https://github.com/sony/gobreaker
Reference
https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern
https://blog.51cto.com/u_15197573/5163214
https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247506440&idx=4&sn=5719c4fa0b9c80ed2ea0ab3c35d19a6b&chksm=fbb153f6ccc6dae02cf5caae458cd245bde5ecf9ca3aa2905eab9a47cc4586064928ef82a314&scene=27
https://landscape.cncf.io/