Java虚拟机:SpringCloud的限流、降级和熔断——Hystrix( 五 )
1、允许熔断器强制打开 ,circuitBreaker.forceOpen为true , 不允许放行 , 返回 。
【Java虚拟机:SpringCloud的限流、降级和熔断——Hystrix】2、如果熔断器强制关闭 ,circuitBreaker.forceOpen为true , 允许放行 。此外不必关注熔断器实际状态 , 也就是说熔断器仍然会维护统计数据和开关状态 , 只是不生效而已 。
第二步 , 调用isOpen()判断熔断器开关是否打开
1、 如果熔断器开关打开 , 进入第三步 , 否则继续;
2、 如果一个周期内总的请求数小于circuitBreaker.requestVolumeThreshold的值 , 允许请求放行 , 否则继续;
3、 如果一个周期内错误率小于circuitBreaker.errorThresholdPercentage的值 , 允许请求放行 。 否则 , 打开熔断器开关 , 进入第三步 。
第三步 ,调用allowSingleTest()判断是否允许单个请求通行 , 检查依赖服务是否恢复
如果熔断器打开 , 且距离熔断器打开的时间或上一次试探请求放行的时间超过circuitBreaker.sleepWindowInMilliseconds的值时 , 熔断器器进入半开状态 , 允许放行一个试探请求;否则 , 不允许放行 。
此外 , 为了提供决策依据 , 每个熔断默认维护了10个bucket , 每秒一个bucket , 当心的bucket被创建时 , 最旧的bucket会被抛弃 。 其中每个bucket维护了请求、失败、超时、拒绝的计数器 , Hystrix负责收集并统计这些计数器 。
本文插图
(四)回退降级
降级 , 通常指事务高峰期 , 为了保证核心服务正常运行 , 需要停掉一些不太重要的业务 , 或者某些服务不可用时 , 执行备用逻辑从故障服务中快速失败或快速返回 , 以保障主体业务不受影响 。Hystrix提供的降级主要是为了容错 , 保证当前服务不受依赖服务故障的影响 , 从而提高服务的健壮性 。 要支持回退或降级处理 , 可以重写 HystrixCommand的getFallBack方法或HystrixObservableCommand的resumeWithFallback方法 。
1、Hystrix在以下几种情况下会走降级逻辑:
- 执行construct()或run()抛出异常
- 熔断器打开导致命令短路
- 命令的线程池和队列或信号量的容量超额 , 命令被拒绝
- 命令执行超时
(1)Fail Fast快速失败
快速失败是最普通的命令执行方法 , 命令没有重写降级逻辑 。如果命令执行发生任何类型的故障 , 它将直接抛出异常 。
(2)Fail Fast无声失败
指在降级方法中通过返回null , 空Map , 空List或其他类似的响应来完成 。
(3)FallBack:Static
指在降级方法中返回静态默认值 。这不会导致服务以“无声失败”的方式被删除 , 而是导致默认行为发生 。 如:应用根据命令执行返回true / false执行相应逻辑 , 但命令执行失败 , 则默认为true 。
(4)FallBack:Stubbed
当命令返回一个包含多个字段的复合对象时 , 适合以Stubbed 的方式回退 。
(5)FallBack:Cache via Network
有时 , 如果调用依赖服务失败 , 可以从缓存服务(如redis)中查询旧数据版本 。 由于又会发起远程调用 , 所以建议重新封装一个Command , 使用不同的ThreadPoolKey , 与主线程池进行隔离 。
(6)Primary+Secondary with FallBack
有时系统具有两种行为- 主要和次要 , 或主要和故障转移 。 主要和次要逻辑涉及到不同的网络调用和业务逻辑 , 所以需要将主次逻辑封装在不同的Command中 , 使用线程池进行隔离 。 为了实现主从逻辑切换 , 可以将主次command封装在外观HystrixCommand的run方法中 , 并结合配置中心设置的开关切换主从逻辑 。 由于主次逻辑都是经过线程池隔离的HystrixCommand , 因此外观HystrixCommand可以使用信号量隔离 , 而没有必要使用线程池隔离引入不必要的开销 。 原理图如下:
推荐阅读
- 『』一文详解以太坊虚拟机(EVM)的数据存储机制
- 『JavaScript』种草 ES2020 八大新功能
- [函数式]JavaScript面试问题:函数式编程
- @参加Java培训班能达到什么水平以及当前应该注重哪个技术的学习
- ##B站上被下载达5166万次的Python+Java编程视频教程,全套免费领取
- #虚拟机#七层网络到大二层网络的深层原因—数据中心的网络变革
- ##微软推出基于AMD霄龙+Radeon Instinct的Azure NVv4虚拟机
- 『CentOS』CentOS 8.1 Linux系统虚拟机封装-Linux系统运维实战系列二
- 『』你写的Java对象究竟占多少内存?
- 『文档』JAVA开发5类应该知道的网站,你都用过吗?