程序员

服务容错保护:SpringCloud Hystrix

2018-06-24  本文已影响2人  没睡醒的鱼

背景

在微服务架构中,存在着很多的服务单元,若一个单元出现故障,就很容易因为依赖关系而导致故障的蔓延,最终导致整个系统的瘫痪,为了解决这个问题,产生了断路器等一系列服务保护机制。SpringCloud Hystrx具备服务降级,服务熔断,请求缓存,请求合并以及服务监控等强大功能

雪崩效应的常见场景

基础服务的故障会导致其他服务发生故障,服务与服务之间相互依赖,从而发生崩溃,我们称这种现象为雪崩效应。它的常见场景如下:

初探Hystrix

Hystrix的工作流程
  1. 构造一个HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数
  2. 执行命令,Hystrix提供了4种执行命令的方法
  3. 判断是否使用缓存响应请求,若启动了缓存且缓存可用,直接使用缓存响应请求
  4. 判断熔断器是否打开,如果打开跳到第8步
  5. 判断线程池/队列/信号量是否已满,已满则跳到第8步
  6. 执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或超时,跳到第8步,否则跳到第9步
  7. 统计熔断监控指标
  8. 走Fallback备用逻辑
  9. 返回响应请求
Hystrix执行命令的几种方法

execute()和queue()适用于HystrixCommand对象,而observe()和toObserveable()方法适用于HystrixObservableComand对象

Hystrix容错

Hystrix的容错主要是通过添加容许延迟和容错方法,帮助控制这些分布式服务之间的交互。还通过隔离服务之间的访问点,阻止他们之间的联级故障以及提供回退选项来提高系统的弹性。Hystrix主要有以下几种容错方法:

资源隔离

资源隔离主要是对线程的隔离,Hystrix提供了两种线程隔离的方式:线程池和信号量

线程隔离-线程池
Hystrix通过命令模式对发送请求的对象和执行请求的对象进行解耦,将不同的业务请求封装成对应的命令请求。当第一次创建Command时,根据配置创建一个线程池,后续相同的请求创建Command时,将会重用已创建的线程池 。通过将发送请求线程与执行请求的线程分离,可有效防止发生级联故障。当线程池或请求队列饱和时,Hystrix将拒绝服务,使得请求线程可以快速失败,从而避免依赖问题扩散。 线程隔离之后服务的依赖关系
线程池隔离的优缺点

优点:

线程隔离-信号量

当依赖延迟极低的服务时,线程池隔离技术引入的开销超过了它所带来的好处。这时候可以使用信号量隔离技术来代替。客户端想依赖服务发起请求时,首先要获取一个信号量才能真正发起调用,由于信号量的数量有限,当并发请求量超过信号量个数时,后续的操作都会直接拒绝。信号量隔离主要是通过控制并发请求量,达到限流的目的

线程池和信号量的区别

熔断

Hystrix向熔断器报告成功,失败,超时和拒绝的状态,熔断器维护并统计这些数据,并根据这些统计信息来决策熔断开关是否打开。如果打开,熔断后续请求,快速返回。每隔一段时间后(默认5秒)熔断器尝试半开,放入一部分请求流量进来,如果请求成功,熔断器关闭

熔断器配置
熔断器工作原理
  1. 调用allowRequest()判断是否允许将请求提交到线程池
  2. 调用isOpen()判断熔断器是否打开。如果熔断器打开进入第三步;否则继续判断如果一个周期内总的请求数小于circuitBreaker.requestVolumeThreshold的值,请求允许放行;否则继续判断如果一个周期内错误率小于circuitBreaker.errorThresholdPercentage的值,请求允许放行,否则打开熔断器进入第三步
  3. 调用allowSingleTest()判断是否允许单个请求通行:如果熔断器打开,且距离熔断器打开时间或上一次试探请求时间超过circuitBreaker.sleepWindowInMilliseconds值,熔断器进入半开状态允许放行一个试探请求,否则不允许放行

回退降级

降级,通常情况下是指业务高峰期,为了保证核心服务正常运行,需要停掉一些不太重要的业务;或者某些服务不可用时,执行备用逻辑从故障服务中快速失败或快速返回,以保证主体业务不受影响
Hystrix在以下几种情况下会走降级逻辑:

降级回退方式
上一篇 下一篇

猜你喜欢

热点阅读