回顾微服务断路器Hystrix

介绍了Hystrix作为Spring Cloud的重要组件如何通过断路器模式预防服务雪崩效应,实现服务间的容错机制。包括服务降级、隔离资源等关键特性。

一 概述

在分布式系统下,微服务之间不可避免地会发生相互调用,但是没有一个系统能够保证自身运行的绝对正确。微服务在调用过程中,很可能会面临依赖服务失效的问题,这些问题的发生会有很多原因,有可能是因为服务之间的网络通信出现较大的延迟,或者是被调用的微服务发生了调用异常,还有可能是因为依赖的微服务负载过大无法及时响应请求等。

Hystrix能够在依赖服务失效的情况下,通过隔离系统依赖服务的方式,防止服务级联失败;同时Hystrix提供失败回滚机制,使系统能够更快地从异常中恢复。

二 Spring Cloud Netflix Hystrix 

spring-cloud-netflix-hystrix对Hystrix进行封装和适配,使Hystrix能够更好地运行于Spring Cloud环境中,为微服务间的调用提供强有力的容错机制。

Hystrix的功能

  • 在通过第三方客户端访问(通常是通过网络)依赖服务出现高延迟或者失败时,为系统提供保护和控制。
  • 在复杂的分布式系统中防止级联失败(服务雪崩效应)。
  • 快速失败(Fail fast)同时能够快速恢复。
  • 提供失败回滚(Fallback)和优雅的服务降级机制。
  • 提供近实时的监控,报警和运维控制手段。

三 Hystrix原理

1. 服务雪崩

服务雪崩效应是一种因服务提供者的不可用导致服务调用者的不可用,并将不可用逐渐放大的过程。服务雪崩的产生可能导致分布式系统的瘫痪。

服务雪崩效应的产生一般有三个流程:

  1. 首先是服务提供者不可用
  2. 然后重试会导致网络流量加大
  3. 最后导致服务调用者不可用

2. 断路器

在分布式系统中,不同服务之间的调用非常常见,当服务提供者不可用时就很有可能发生服务雪崩效应,导致整个系统的不可用。基于这种情况,使用断路器模式进行预防(类比于电路中的断路器,在电路过大的时候自动断开,防止电线过热损害整条电路)。

断路器将远程方法调用包装到一个断路器对象中,用于监控方法调用过程的失败。一旦该方法调用发生的失败次数在一段时间内达到一定的阈值,那么这个断路器将会跳闸,在接下来时间里再次调用该方法将会被断路器直接返回异常,而不再发生该方法的真实调用。这样就避免了服务调用者在服务提供者不可用时发送请求,从而减少线程池中资源的消耗。,提供了服务调用者。

断路器不同的各种状态

关闭状态:断路器处于关闭状态,统计调用失败次数,在一段时间内达到一定的阈值后断路器打开。

打开状态:断路器处于打开状态,对方法调用直接返回失败错误,不发生真正的方法调用。设置了一个重置时间,在重置时间结束后,断路器来到半开状态。

断路器的时序图

断路器的状态图

半开状态:断路器处于半开状态,此时允许进行方法调用,当调用成功了(或者成功到达一定的比例),关闭断路器,否则认为服务没有恢复,重新打开断路器。

断路器的打开能够保证服务调用者在调用异常服务时,快速返回结果,避免大量的同步等待,减少服务调用者的资源消耗。并且断路器能在打开一段时间后继续侦测请求执行结果,判断断路器是否能关闭,恢复服务的正常调用。

3. 服务降级操作

断路器为隔断服务调用者和异常服务提供者防止服务雪崩的现象,提供了一种保护措施。而服务降级是为了在整体资源不够的时候,适当放弃部分服务,将主要的资源投放到核心服务中,待渡过难关之后,再重启已关闭的服务,保证了系统核心服务的稳定。

在Hystrix中,当服务间调用发生问题时,它将采用备用的Fallback方法代替主方法执行并返回结果,对失败服务进行服务降级。当调用服务失败次数在一段时间内超过了断路器的阈值时,断路器将打开,不再进行真正的方法调用,而是快速失败,直接执行Fallback逻辑,服务降级,减少服务调用者的资源消耗,保护服务调用者中的线程资源。

服务降级时的时序图

4. 隔离资源

线程与线程池:Hystrix通过将调用服务线程与服务访问的执行线程分隔开来,调用线程能够空出来去做其他的工作而不至于因为服务调用的执行阻塞过长时间。在Hystrix中,将使用独立的线程池对应每一个服务提供者,用于隔离和限制这些服务。从而,某个服务提供者的高延迟或者饱和资源受限只会发生在该服务提供者对应的线程池中。

资源隔离示意图

如图:Dependency D的调用失败或者高延迟仅会导致自身对应的线程池中的5个线程阻塞,并不会影响其他服务提供者的线程池。系统完全与服务提供者请求隔离开来,即使服务提供者对应的线程完全耗尽,并不会影响系统中的其他请求。

注意的是在服务提供者的线程池被占满的情况下,对该服务提供者的调用会被Hystrix直接进入回滚逻辑,快速失败,保护服务嗲用着的资源稳定。

信号量:除了线程池之外,Hystrix还可以通过信号量(计数器)来限制单个服务提供者的并发量。如果通过信号量来控制系统负载,将不再允许设置超时控制和异步化调用,这就表示服务提供者出现高延迟时,其调用线程将会被阻塞,直至服务提供者的网络请求超时。如果对服务提供者的稳定性有足够的信心,可以通过信号量来控制系统的负载。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值