什么是熔断降级?

​在开发高并发系统时,有三把利器用来保护系统:缓存、熔断降级和限流,前面我们介绍过了限流,今天我们就来介绍下熔断降级。

在分布式系统中,一个服务往往依赖多个服务,可能存在某个服务调用失败,比如超时、异常等,更坏的情况是,如果有多个服务对同一个挂起的服务进行调用,那么就很有可能的是一个服务的超时等待迅速蔓延到整个分布式系统,引起雪崩效应。

一般来说,解决思路是熔断或降级,通过提供有损服务,保证服务的柔性可用,避免雪崩效应。

什么是熔断

熔断其实很好理解,生活中就有大量的场景。比如,保险丝,可以在短路的时候自动跳闸,保护加点。又如,股票交易中,如果股票指数过高,也会采用熔断机制,暂停股票交易。

在分布式系统中的熔断,也可以保护我们的系统,一个上游服务,可能调用多个下游服务。比如一个购物模服务,需要调用订单服务,支付服务,统计服务等等,如果下游服务出现了故障,上游服务还是继续访问的话,就可能回出现请求无法被解决,被堆积的情况,更坏的情况是可能造成系统雪崩,这个时候,熔断就可以上场了,熔断器可以防止服务不断的去尝试下游可能超时或失败的服务,即时断开这条链路,保护下游服务,并且熔断器会自动诊断下游服务是否已经修复,如果还未修复,依然保持熔断状态,如果已经修复,则逐步放量请求直至恢复到故障前的状态。

什么是降级

服务降级是服务器压力剧增的时候,根据当前业务情况及流量,为了预防某些功能出现符合过载或者响应慢的情况,在其内部暂时舍弃一些非核心的请求,直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损服务,但可以保证整个系统的稳定性和可用性。

降级的功能点主要从服务端链路考虑,即根据用户访问的服务调用链路来梳理哪里需要降级:

1、页面降级:在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;

2、页面片段降级:比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;

3、页面异步请求降级:比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;

4、服务功能降级:比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;

5、读降级:比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;

6、写降级:比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。

7、爬虫降级:在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。


断路器

断路器(Circuit Breaker)模式就是为了防止在分布式系统中出现这种瀑布似的连锁反应导致的灾难。

一旦某个电器出问题,为了防止灾难,电路的保险丝就会熔断。断路器类似于电路的保险丝, 实现思路非常简单,可以将需要保护的远程服务调用封装起来,在内部监听失败次数, 一旦失败次数达到某阀值后,所有后续对该服务的调用断路器截获后都直接返回错误到调用方,而不会继续调用已经出问题的服务, 从而达到保护调用方的目的, 整个系统也就不会出现因为超时而产生的瀑布式连锁反应。

1、基本模式

上图是断路器(Curcuit Breaker)的结构,它有两个基本状态(close和open)和一个基本trip动作

1)close状态下,client向 supplier发起的服务请求,直接无阻碍通过断路器, supplier的返回值接直接由断路器交回给client。

2)open状态下,client 向 supplier 发起的服务请求后,断路器不会将请求转到supplier, 而是直接返回 client, client和 supplier 之间的通路是断的。

3)trip: 在close状态下,如果supplier持续超时报错,达到规定的阀值后,断路器就发生trip, 之后断路器状态就会从close进入open。

2、扩展模式

基本的断路器模式下,保证了断路器在open状态时,保护supplier不会被调用,但我们还需要额外的措施可以在supplier恢复服务后,可以重置断路器。一种可行的办法是断路器定期探测supplier的服务是否恢复,一但恢复,就将状态设置成close。断路器进行重试时的状态为半开(half-open)状态

3、适用场景

一个supplier一般很稳定,如果一旦故障发生后,检查和恢复需要的时间比较长,通常无法短时间内快速修复的,那么这种服务比较适合采用断路器模式。

4、不适用场景

1)为了防止一个应用程序试图调用一个远程服务或访问共享资源,如果该操作是极有可能失败,这种模式可能不适合。

2)对于处理中的应用程序访问本地专用资源,例如在存储器内数据结构。在这种环境下通常也不适合,使用断路器只会增加系统开销。

转载自:https://www.cnblogs.com/chry/p/7278853.html


关注WX公众号:【老司机de程序人生】—学习更多Java技术

举报
评论 0