Spring Cloud—容错Hystrix

Hystrix工作流程(命令模式)

首先会判断响应结果是否在缓存中;若在缓存中,则直接返回结果;若不存在缓存中,则判断断路器是否打开;若断路器打开,则直接执行回退方法(即服务降级);若断路器关闭,(每个命令都会开启一个线程)则判断线程池是否满了;若线程池满了,则查看排队的线程(队列大小)是否达到上限,若已经达到上限,则执行回退方法,若未达到上限,则排队等待执行;若线程池没满,则执行命令,若命令执行没有超时,则返回命令执行结果;若命令执行超时,则执行回退方法;

hystrix.threadpool.default.coreSize

核心线程池大小(默认10)

hystrix.threadpool.default.queueSizeRejectionThreshold

队列大小(默认5)

 


熔断(断路器)

断路器默认关闭状态

当同时满足以下两个前提的时候,断路器会自动开启

  1. 链路达到一定阀值,默认10秒内产生超过20次请求
  2. 满足第一个条件的情况下,请求的错误率超过阀值,默认50%

断路器自打开后,会有一个默认5秒的“休眠期”,休眠期内命令不会被执行(一直触发回退),过了休眠期,Hystirx会尝试执行一次命令,此时断路器会处于半开半关状态;若此次命令执行成功,则断路器会关闭,且重置链路的健康信息;如果执行失败,断路器继续保持打开状态

hystrix.command.default.circuitBreaker.requestVolumeThreshold

链路阀值(默认20)

hystrix.command.default.circuitBreaker.errorThresholdPercentage

错误率阀值(默认50%)

hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds

休眠期(默认5000毫秒)


隔离

Hystrix提供两种隔离策略,在命令执行上,实现错误的隔离,从而保护集群

默认使用线程隔离

  1. 线程隔离(THREAD

给每个服务分配一个线程池,内含10(默认)个线程,当线程池满了,第11个请求过来的时候,开始排队,队伍上限为5(默认),第16个请求过来的时候,直接走fallback流程,不再对服务进行请求。已经执行请求的线程在调用结束后反馈调用情况,交由Metrics保存,根据Metrics里的计数,计算服务的健康状态,从而决定是否熔断。好处是,当并发高起来的时候,就算线程池满了,无法执行服务调用,也可以把请求放入队列等待,不至于立即fallback。

 

      2.信号量隔离(SEMAPHORE

有一个原子计数器,也即信号量,记录了现在运行线程的数量。当新请求进来的时候,先判断信号量是否达到阈值10(默认),如果小于,则+1,继续执行服务调用,执行完毕后,-1。如果已经达到阈值,则直接fallback。相比线程池,好处是没有线程切换的开销。坏处就是一旦达到阈值,就直接fallback,不像线程池还有个队列可以缓冲一下

hystrix.command.default.execution.isolation.strategy

THREAD(默认)SEMAPHORE

hystrix.threadpool.default.coreSize

默认10

hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests

默认10


 

缓存

场景:一次请求中,多个地方调用同一接口(销售模块调用同一商品信息),缓存打开后,在同一请求上下文中,下一次的命令不会执行,会直接去缓存中获取相应数据并返回;

 

总结Hystrix特性

  1. 服务降级
  2. 熔断
  3. 隔离
  4. 缓存
  5. 请求合并

猜你喜欢

转载自blog.csdn.net/Peacock__/article/details/86168729