`
m635674608
  • 浏览: 5042330 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Hystrix详述(一)

 
阅读更多

一、hystrix的作用

  • 控制被依赖服务的延时和失败
  • 防止在复杂系统中的级联失败
  • 可以进行快速失败(不需要等待)和快速恢复(当依赖服务失效后又恢复正常,其对应的线程池会被清理干净,即剩下的都是未使用的线程,相对于整个 Tomcat 容器的线程池被占满需要耗费更长时间以恢复可用来说,此时系统可以快速恢复)
  • getFallback(失败时指定的操作)和优雅降级
  • 实现近实时的检测、报警、运维

二、hystrix实现中需要注意的点

  • 为每一个依赖服务维护一个线程池(或者信号量),当线程池占满+queueSizeRejectionThreshold占满,该依赖服务将会立即拒绝服务而不是排队等待
  • 引入『熔断器』机制,在依赖服务失效比例超过阈值时,手动或者自动地切断服务一段时间
  • 当请求依赖服务时出现拒绝服务、超时或者短路(多个依赖服务顺序请求,前面的依赖服务请求失败,则后面的请求不会发出)时,执行该依赖服务的失败回退逻辑

三、hystrix线程模型

  • 为每一个服务提供一个线程池,线程池数量可以配置。(每个Netflix API实例有超过 40 个线程池,每个线程池有 5 到 20 个工作线程(绝大部分设置为 10 个线程))
  • 每个依赖服务都被隔离开来,Hystrix 会严格控制其在延迟发生时对资源的占用,并在任何失效发生时,执行失败回退逻辑
    • 注意:隔离是非常好的,隔离后,延时的被调用服务只会耗尽自己的线程池,之后进入失败,见下图(附:清晰大图);如果不隔离,可能会耗尽整个tomcat的线程池,导致整个系统瘫痪。
  • tomcat线程(即调用线程)将请求接过来后,交给被依赖服务自己的线程池中的线程去执行(此时调用线程就可以去做其他的事情了,这与mina2的线程模型有相似之处)

 

四、hystrix执行流程(工作机理)

附:清晰大图

步骤:(配合上图去看)

1、构建HystrixCommand或者HystrixObservableCommand对象

2、执行命令(execute()、queue()、observe())获得返回结果(仅仅是获得,并没有返回给调用端)

3、如果请求结果缓存这个特性被启用,并且缓存命中,则缓存的回应会立即通过一个 Observable 对象的形式返回。

4、检查熔断器状态,确定请求线路是否是开路,如果请求线路是开路,Hystrix 将不会执行这个命令,而是直接使用『失败回退逻辑』(即不会执行run(),直接执行getFallback())

5、如果和当前需要执行的命令相关联的线程池和请求队列(或者信号量,如果不使用线程池)满了,Hystrix 将不会执行这个命令,而是直接使用『失败回退逻辑』(即不会执行run(),直接执行getFallback())

6、执行HystrixCommand.run()或HystrixObservableCommand.construct(),如果这两个方法执行超时或者执行失败,则执行getFallback();如果正常结束,Hystrix 在添加一些日志和监控数据采集之后,直接返回回应

7、Hystrix 会将请求成功,失败,被拒绝或超时信息报告给熔断器,熔断器维护一些用于统计数据用的计数器。

这些计数器产生的统计数据使得熔断器在特定的时刻,能短路某个依赖服务的后续请求,直到恢复期结束,若恢复期结束根据统计数据熔断器判定线路仍然未恢复健康,熔断器会再次关闭线路。

 

 

五、熔断器执行流程(工作机理)

附:清晰大图

1、假设线路内的容量(请求QPS)达到一定阈值(通过 HystrixCommandProperties.circuitBreakerRequestVolumeThreshold() 配置),同时,假设线路内的错误率达到一定阈值(通过 HystrixCommandProperties.circuitBreakerErrorThresholdPercentage() 配置)

2、熔断器将从『闭路』转换成『开路』

3、若此时是『开路』状态,熔断器将短路后续所有经过该熔断器的请求,这些请求直接走『失败回退逻辑』(即不走run(),直接走getFallback())

4、经过一定时间(即『休眠窗口』,通过 HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds() 配置),后续第一个请求将会被允许通过熔断器(此时熔断器处于『半开』状态),若该请求失败,熔断器将又进入『开路』状态,且在休眠窗口内保持此状态;若该请求成功,熔断器将进入『闭路』状态,回到逻辑1循环往复。

 

六、线程池与信号量

使用场景:对于那些本来延迟就比较小的请求(例如访问本地缓存成功率很高的请求)来说,线程池带来的开销是非常高的,这时,你可以考虑采用其他方法,例如非阻塞信号量(不支持超时),来实现依赖服务的隔离,使用信号量的开销很小。但绝大多数情况下,Netflix 更偏向于使用线程池来隔离依赖服务,因为其带来的额外开销可以接受,并且能支持包括超时在内的所有功能。

如果你对客户端库有足够的信任(延迟不会过高),并且你只需要控制系统负载,那么你可以使用信号量。

 

七、请求合并

 

参考:

https://github.com/Netflix/Hystrix/wiki

http://youdang.github.io/categories/%E7%BF%BB%E8%AF%91/ 对官网翻译的非常好,可惜没有翻译完

 

https://my.oschina.net/yu120/blog/714746

分享到:
评论

相关推荐

    实习生如何写好一份简历

    对于Java实习生,专业技能部分应详述如下: 1. **基础开发技术**:强调对Java语法、面向对象编程、多线程的理解,例如使用ArrayList、HashMap、ConcurrentHashMap等集合类,以及对锁机制、volatile关键字、原子类的...

    Eclipse搭建SpringCloud.zip

    本教程将详述如何使用Eclipse搭建Spring Cloud的步骤,以及涉及的相关知识点。 首先,我们需要确保Eclipse已经安装了Java开发工具(JDT)、Maven插件和Spring Tools Suite(STS)。JDT用于Java编程,Maven则帮助...

    springcloud+vue实现电商系统.zip

    2. 熔断与降级:采用Hystrix组件,提供服务容错能力,当服务不可用时,可以快速熔断,防止雪崩效应,并执行降级策略,保证系统的稳定运行。 3. 负载均衡:使用Ribbon或Feign组件,实现客户端的负载均衡,合理分配...

    Spring学习笔记&源码

    8. **Spring Cloud**:如果包含高级内容,可能还会涉及到Spring Cloud的相关组件,如Eureka服务注册与发现、Ribbon客户端负载均衡、Hystrix熔断器等。 源码部分则提供了实际操作的示例,包括但不限于: 1. **简单...

    尚硅谷mysql高级+尚硅谷springcloud思维导图.mmap

    MySQL是一款广泛使用的开源关系型数据库管理系统,它以其高效、稳定、易用的特点在众多企业中占据重要地位。尚硅谷周阳老师的MySQL高级课程深入讲解了MySQL的高级特性与最佳实践,旨在帮助学员掌握更深层次的数据库...

    阿里云 专有云企业版 V3.8.0 企业级分布式应用服务 技术白皮书 20190621.pdf

    《阿里云专有云企业版 V3.8.0 企业级分布式应用服务技术白皮书》详述了阿里云为企业级用户提供的专有云解决方案,该版本专注于V3.8.0的企业级分布式应用服务(Enterprise Distributed Application Service,简称EDAS...

    轻量级微服务上下册.zip

    常见的服务发现工具有Eureka、Consul和Zookeeper等,这些工具的工作原理和使用场景在书中会有详述。 3. **服务注册**:服务注册是服务发现的一部分,每个微服务实例启动时会向注册中心注册自己的元数据信息,如服务...

    微服务系统和数据库设计方案.docx

    使用Eureka作为服务注册中心,Zuul作为API网关进行路由和负载均衡,Ribbon实现内部服务调用的负载均衡,Feign用于服务间的透明调用,Hystrix作为断路器提供容错保护,SpringCloud Config用于统一配置管理,同时结合...

    Java面试spring专题.zip

    8. **Spring Cloud**:讨论Spring Cloud在微服务架构中的应用,如服务发现(Eureka)、配置中心(Config Server)、断路器(Hystrix)和负载均衡(Ribbon)等。 9. **面试技巧**:提供面试中可能会问到的问题,如...

    基于Springboot的秒杀系统(有报告) Javaee项目,springboot项目

    Spring Boot结合负载均衡和限流策略,如Spring Cloud Gateway和Hystrix,可以有效地分发请求,防止系统过载。 2. **分布式事务**:在多服务环境中,可能涉及跨服务的交易一致性,Spring框架的分布式事务管理能力有...

    大型分布式网站架构设计与实践

    微服务架构、服务注册与发现(如Eureka、Zookeeper)、服务调用协议(如REST、gRPC)和服务熔断、限流(如Hystrix)等技术将在书中得到详述。 6. 容错与恢复:在分布式环境中,节点故障是常态。书中会介绍如何设计...

    Java-SpringBoot的分布式架构网上购物商城系统毕业设计源码(源代码+论文)

    因此,分布式架构应运而生,成为了现代商城系统的核心技术之一。Java SpringBoot因其轻量级、便捷的特性,成为开发分布式系统的首选框架。 **SpringBoot与分布式架构** SpringBoot简化了Spring应用的初始搭建以及...

    2022java大厂面试真题

    7. 微服务:Docker容器化、服务发现(Eureka、Consul)、API网关(Zuul、Spring Cloud Gateway)、熔断降级(Hystrix、Resilience4j)。 8. Dubbo:远程调用、注册中心、监控中心、服务治理。 9. Netty:高性能NIO...

    19Spring项目:19Spring项目

    3. 教程文档:可能有Markdown或PDF格式的说明文件,详述项目背景、实现步骤、技术要点等。 4. 数据库脚本:SQL文件用于创建数据库表结构和初始化数据。 5. Jupyter Notebook:可能包含数据分析、问题解决过程或代码...

    course:Spring Cloud + Vue 企业级在线视频课程系统

    3. **Spring Cloud组件**:详述Eureka的注册与发现,Ribbon和Zuul的负载均衡,Hystrix的熔断降级,以及Feign的声明式服务调用。 4. **Vue.js基础**:掌握Vue实例、指令、组件、计算属性和监听器等核心概念。 5. **...

    SpringBoot深入实践pdf及源码

    8. **云原生特性**:探讨SpringBoot如何支持Docker容器化,以及Spring Cloud相关的服务发现、配置中心、熔断器(Hystrix)等微服务架构组件。 源码部分则对应了书中的示例代码,读者可以通过阅读和运行这些代码来...

    SpringCloud 框架基本模块梳理(四)

    当然,Feign还支持Hystrix熔断器,以便在服务故障时提供保护,不过这部分内容在这里不再详述。 **二、Stream-RabbitMQ** Stream-Rabbit是SpringCloud Stream的一部分,用于实现基于RabbitMQ的消息传递。在项目中,...

Global site tag (gtag.js) - Google Analytics