当前位置:

首页 > java的降级组件Hystrix有哪些功能

java的降级组件Hystrix有哪些功能

1、面试官:能简单介绍下Hystrix有哪些功能吗?问题分析:了解Hystrix的功能,同时也能从Hystrix优秀的设计理念中得到架构设计方面的启发。答:我在项目里使用到,系统在Hystrix的保护下,可以长期处于高可用的状态,常用的功能有以下几点:1.1、fail-fast(快速失败)Hystrix设计中提供了fail-fast(快速失败)和快速恢复机制。Tip:不知道之前你是否了解过fail-fast机制,或者面试Java基础的时候,HashMap中的Iterator迭代器,Iterator的设计就

    1、面试官:能简单介绍下Hystrix有哪些功能吗?

    问题分析:了解Hystrix的功能,同时也能从Hystrix优秀的设计理念中得到架构设计方面的启发。

    答:我在项目里使用到,系统在 Hystrix 的保护下,可以长期处于高可用的状态,常用的功能有以下几点:

    1.1、fail-fast(快速失败)

    Hystrix设计中提供了 fail-fast(快速失败)和快速恢复机制。

    Tip:不知道之前你是否了解过fail-fast机制,或者面试Java基础的时候,HashMap 中的 Iterator 迭代器,Iterator的设计就是 fail-fast 的,**快速失败(fail—fast)**是Java集合中的一种机制, 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。

    我第一次学习 HashMap 并不是很懂 fail-fast,觉得快速失败只是应用在Java集合类中,防止Java非线程安全集合的并发操作,学习使用 Hystrix 后,原来快速失败机制还可以应用在系统架构设计中,对无法及时处理的请求快速失败(fail-fast),降低系统负载,而不是排队。

    1.2、Fallback优雅降级机制

    Fallback 字面意思是遇到Fall就启动back,了解到Fallback的机制后,我马上在项目中用起来。

    看真实例子:

     @Override
        @Degrade(key = "getOrderByParamFromES", fallBackMethod = "getOrderByParamFromMysql")
        public OrderResult getOrderByParamFromES(OrderSearchParam param) {
            //走ES查询
            ......
            return OrderResult;
        }
     		//fallBack后调用getOrderByParamFromMysql方法
     		public OrderResult getOrderByParamFromMysql(OrderSearchParam param) {
            //走mysql查询
            ......
            return OrderResult;
        }

    代码解释:

    fallBackMethod = "getOrderByParamFromMysql"

    就是在ES查询故障失败后,系统自动降级调getOrderByParamFromMysql方法,走mysql查询,正常情况下,getOrderByParamFromMysql是不会被调用的,除非Fall。

    1.3、线程/信号量隔离机制

    线程隔离:

    请求会根据自己的key获取对应线程池中的线程执行,动态设置线程池参数,这样自然地将不同的请求隔离开来,支持异步来提高接口性能。不同请求直接不影响,例如service1请求缓慢,但是service2和service3还是可以正常工作,缺点就是线程切换影响性能。

    信号量隔离:

    一个请求中访问了service1、service2、service3,其中service1请求超时,将导致整个信号量一直不释放,其他请求一直无法接受。

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

    2、面试官:刚刚说到线程隔离,那实际使用中是否打开超时线程中断开关?

    问题分析:考察实际使用经验,根据线程本身的特点,线程超时,如果不及时中断,会浪费线程资源。

    答:一般情况下我们会打开超时中断开关,目的是及时释放线程资源。

    通过hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true 设置。

    但是如果是写数据库命令,或者记录关键日志命令的情况下,需要命令执行完毕情况,可关闭超时中断。

    (面试官点头满意,相信我确实有Hystrix的维护经验)

    3、面试官:那你是如何估计线程池大小的?

    答:要正确设置线程池的大小,需要分析所部署系统的CPU个数、内存大小、任务类型(计算密集、IO密集等),对于计算密集型任务,线程池大小和CPU个数相近通常能实现最优利用率,对于IO密集型任务,线程池的最优大小的计算公式:线程池大小=CPU个数* (1 + 任务等待时间/ 任务处理时间)。

    深入分析

    Hystrix历史

    Hystrix源自Netflix API团队于2011年开始的项目。2012年,Hystrix不断发展和成熟,Netflix内部的许多团队都采用了它。如今,每天在Netflix上通过Hystrix执行数百亿个线程隔离和数千亿个信号量隔离的调用。这极大地提高了正常运行时间和弹性。

    在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等。我们要构建稳定、可靠的分布式系统,就必须要有这样一套容错方法。

    Hystrix的主要功能特性

    熔断器机制:熔断器可以理解成保险丝,项目里使用Hystrix Command,当 Hystrix Command请求后,如果服务失败数量超过一定比例(比如默认50%),断路器自动熔断,该服务将进入熔断状态,后续请求都会进入fallback。

    降级机制:通过fallbackMethod注解,当请求后端服务出现异常的时候, 为了避免影响到其他业务逻辑,可以使用fallback方法指定的方法快速返回,或启用“备胎方案”。

    环境隔离:包括线程隔离和信号量隔离。

    cache:Hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。

    Hystrix Demo

    通过一个demo快速理解Hystrix fallback 的使用

    @Service
    public class OrderQueryService {
         /**
         * 订单查询接口
         */
        @HystrixCommand(fallbackMethod = "queryOrderBack")
        public List queryOrderFromRedis(String userId) {
          // todo  reids查询逻辑
          return orderlist;
        }
         /**
         * 订单查询接口失败降级方案
         */
        @SuppressWarnings("unused")
        private String queryOrderBack(String userId) {
          // todo  如,走ES查询逻辑  或者 直接提示用户“请稍后再试”
          // todo 通知维护人员处理故障
          return "";
        }
    }

    代码解释:

    程序正常时,查询订单服务是走queryOrderFromRedis方法的逻辑,当queryOrderFromRedis方法抛出异常,根据设定的异常比例,或者指定哪个异常,达到阈值触法fallback开关,程序切换到queryOrderBack,设置程序走ES查询逻辑 或者 直接提示用户“请稍后再试”,根据业务自行设置。

    哪些情况下会触发fallback?

    Failure TypeException classException.cause触发fallback
    FAILUREHystrixRuntimeExceptionunderlying exception (user-controlled)YES
    SEMAPHORE_REJECTEDHystrixRuntimeExceptionj.l.RuntimeExceptionYES
    SHORT_CIRCUITEDHystrixRuntimeExceptionj.l.RuntimeExceptionYES
    THREAD_POOL_REJECTEDHystrixRuntimeExceptionj.u.c.RejectedExecutionExceptionYES
    TIMEOUTHystrixRuntimeExceptionj.u.c.TimeoutExceptionYES

    FAILURE:任意RuntimeException异常都可以激活fallback。

    THREAD_POOL_REJECTED:并发执行的任务数超过线程池和队列之和时,也就是Hystrix的线程隔离机制。

    SEMAPHORE_REJECTED:类似 THREAD_POOL_REJECTED ,当服务的并发数大于信号量阈值时将进入fallback。比如配置程序执行并发数不能大于3,由于信号量隔离下无论调用哪种命令执行方法,Hystrix都不会创建新线程执行run()/construct(),所以调用程序需要自己创建多个线程来模拟并发调用execute(),最后看到一旦并发线程>3,后续请求都进入fallback。

    SHORT_CIRCUITED:在一定时间内,用户请求超过一定的比例失败时,如超时,异常,线程并发达到限定最大值等,断路器都会打开;短路器打开后所有请求直接走fallback,可以通过。circuitBreakerErrorThresholdPercentage方法设置百分比,默认是50。

    TIMEOUT:即超时请求。

    附录:Hystrix策略配置

    /* --------------统计相关------------------*/ 
    // 统计滚动的时间窗口,默认:5000毫秒(取自circuitBreakerSleepWindowInMilliseconds)   
    private final HystrixProperty metricsRollingStatisticalWindowInMilliseconds;   
    // 统计窗口的Buckets的数量,默认:10个,每秒一个Buckets统计   
    private final HystrixProperty metricsRollingStatisticalWindowBuckets; // number of buckets in the statisticalWindow   
    // 是否开启监控统计功能,默认:true   
    private final HystrixProperty metricsRollingPercentileEnabled;   
    /* --------------熔断器相关------------------*/ 
    // 熔断器在整个统计时间内是否开启的阀值,默认20。也就是在metricsRollingStatisticalWindowInMilliseconds(默认10s)内至少请求20次,熔断器才发挥起作用   
    private final HystrixProperty circuitBreakerRequestVolumeThreshold;   
    // 熔断时间窗口,默认:5秒.熔断器中断请求5秒后会进入半打开状态,放下一个请求进来重试,如果该请求成功就关闭熔断器,否则继续等待一个熔断时间窗口
    private final HystrixProperty circuitBreakerSleepWindowInMilliseconds;   
    //是否启用熔断器,默认true. 启动   
    private final HystrixProperty circuitBreakerEnabled;   
    //默认:50%。当出错率超过50%后熔断器启动
    private final HystrixProperty circuitBreakerErrorThresholdPercentage;  
    //是否强制开启熔断器阻断所有请求,默认:false,不开启。置为true时,所有请求都将被拒绝,直接到fallback 
    private final HystrixProperty circuitBreakerForceOpen;   
    //是否允许熔断器忽略错误,默认false, 不开启   
    private final HystrixProperty circuitBreakerForceClosed; 
    /* --------------信号量相关------------------*/ 
    //使用信号量隔离时,命令调用最大的并发数,默认:10   
    private final HystrixProperty executionIsolationSemaphoreMaxConcurrentRequests;   
    //使用信号量隔离时,命令fallback(降级)调用最大的并发数,默认:10   
    private final HystrixProperty fallbackIsolationSemaphoreMaxConcurrentRequests; 
    /* --------------其他------------------*/ 
    //使用命令调用隔离方式,默认:采用线程隔离,ExecutionIsolationStrategy.THREAD   
    private final HystrixProperty executionIsolationStrategy;   
    //使用线程隔离时,调用超时时间,默认:1秒   
    private final HystrixProperty executionIsolationThreadTimeoutInMilliseconds;   
    //线程池的key,用于决定命令在哪个线程池执行   
    private final HystrixProperty executionIsolationThreadPoolKeyOverride;   
    //是否开启fallback降级策略 默认:true   
    private final HystrixProperty fallbackEnabled;   
    // 使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作.默认:true   
    private final HystrixProperty executionIsolationThreadInterruptOnTimeout; 
    // 是否开启请求日志,默认:true   
    private final HystrixProperty requestLogEnabled;   
    //是否开启请求缓存,默认:true   
    private final HystrixProperty requestCacheEnabled; // Whether request caching is enabled
    //请求合并是允许的最大请求数,默认: Integer.MAX_VALUE   
    private final HystrixProperty maxRequestsInBatch;   
    //批处理过程中每个命令延迟的时间,默认:10毫秒   
    private final HystrixProperty timerDelayInMilliseconds;   
    //批处理过程中是否开启请求缓存,默认:开启   
    private final HystrixProperty requestCacheEnabled; 
    /* 配置线程池大小,默认值10个 */ 
    private final HystrixProperty corePoolSize; 
    /* 配置线程值等待队列长度,默认值:-1 建议值:-1表示不等待直接拒绝,测试表明线程池使用直接决绝策略+ 合适大小的非回缩线程池效率最高.所以不建议修改此值。 当使用非回缩线程池时,queueSizeRejectionThreshold,keepAliveTimeMinutes 参数无效 */
    private final HystrixProperty maxQueueSize;

    其他常用限流降级组件

    Sentinel:阿里巴巴集团内部基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。2018 年,Sentinel 开源,并持续演进。

    Resilience4j:也是一个轻量级的容错组件,其灵感来自于 Hystrix,但主要为 Java 8 和函数式编程所设计。轻量级体现在其只用 Vavr库(前身是 Javaslang),没有任何外部依赖。而 Hystrix 依赖了 Archaius ,Archaius 本身又依赖很多第三方包,例如 Guava、Apache Commons Configuration 等。

    Sentinel 与 Hystrix resilience4j 对比

     SentinelHystrixresilience4j
    隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
    熔断降级策略基于响应时间、异常比率、异常数等异常比率模式、超时熔断基于异常比率、响应时间
    实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
    动态规则配置支持多种配置源支持多种数据源有限支持
    扩展性丰富的 SPI 扩展接口插件的形式接口的形式
    基于注解的支持支持支持支持
    限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
    集群流量控制支持不支持不支持
    流量整形支持预热模式、匀速排队模式等多种复杂场景不支持简单的 Rate Limiter 模式
    系统自适应保护支持不支持不支持
    控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统
    多语言支持Java / C++JavaJava
    开源社区状态活跃停止维护较活跃
    本文内容来源于互联网,如有侵权请联系删除。
    作者最新文章
    相关文章 更多
    谷歌浏览器Mac版入口
    谷歌浏览器Mac版入口

    谷歌浏览器Mac版官方安装指南 谷歌浏览器Mac版官方安装入口是https://www.google.com/chrome/,需macOS 12+系统、500MB空间,下载.dmg后拖入应用程序安装,支持多设备同步、性能优化与隐私保护功能。 苹果电脑Chrome的安装入口究竟在哪里?这个问题最近可是

    Chrome浏览器JS脚本不运行怎么办
    Chrome浏览器JS脚本不运行怎么办

    Chrome中JavaScript未执行需依次检查:一、移除站点级禁用并添加允许域名;二、开启全局JavaScript开关;三、禁用干扰扩展;四、在开发者工具中启用JavaScript;五、重置内容设置为默认。 有时在Chrome里打开网页,会发现交互按钮点了没反应,数据加载不出来,页面仿佛“静止”

    IE浏览器怀旧版在线网址
    IE浏览器怀旧版在线网址

    IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

    火狐浏览器有哪些设置功能
    火狐浏览器有哪些设置功能

    火狐浏览器五大核心设置功能:解锁高效、安全与个性化体验 火狐浏览器功能强大,但如果不仔细挖掘,很多能大幅提升效率和安全性的设置可能就“藏着掖着”了。这就好比拥有一台高性能设备,却只用了基础模式。那么,如何把它调整到最顺手、最安全的状态?接下来,我们就聚焦于当前版本(截至2025年末)最关键的五大设置

    chrome搜索免验证入口
    chrome搜索免验证入口

    Chrome官方免验证入口为https://www.google.cn/chrome/,提供全平台安装包、免登录即用、本地化安全机制及引擎级性能优化。 到底该去哪里找正版、免费且无需繁琐验证的Chrome浏览器入口?这个问题困扰了不少网友。今天,我们就来直通核心,为大家详细拆解Chrome引擎的官方

    java heap space 选型思路:使用场景与区别整理
    java heap space 选型思路:使用场景与区别整理

    Java堆是JVM存储对象的核心内存区域,配置需结合场景:单体应用适中设置;大数据处理需大堆并关注GC停顿;微服务强调快速启动;高并发需精细划分堆区域。关键参数-Xms和-Xmx建议等值以稳定性能。垃圾回收器选择影响效率,如G1适用于大堆,ZGC可实现低停顿。内存错误时需监控堆状态。

    java heap space 使用中遇到的问题怎么解决
    java heap space 使用中遇到的问题怎么解决

    Java堆内存溢出错误通常因内存泄漏、数据处理需求过大或JVM参数配置不当引起。排查时可借助jmap、堆转储及MAT等工具定位问题。解决方案包括调整JVM内存参数(如-Xmx)、修复代码中的内存泄漏、优化大数据处理逻辑,并建立持续监控与预防机制,以保障应用稳定运行。

    java xml 选型思路:使用场景与区别整理
    java xml 选型思路:使用场景与区别整理

    XML在Java开发中用于配置、数据交换等场景。解析方式主要有DOM、SAX、StAX及第三方库。DOM适合操作小文件,SAX/StAX适合处理大文件流,JAXB用于对象与XML映射。选型需结合数据大小、内存、性能及团队熟悉度,现代框架常封装底层解析。

    using namespace 使用中遇到的问题怎么解决
    using namespace 使用中遇到的问题怎么解决

    命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

    c语言函数递归 实操经验总结:这些技巧很实用
    c语言函数递归 实操经验总结:这些技巧很实用

    理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    赤友清理大师
    赤友清理大师
    macOS

    赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    WINDOWS 更多
    Windows 10
    Windows 10
    Windows

    Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

    极度公式
    极度公式
    Windows/macOS/Linux

    极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

    密码键盘
    密码键盘
    Windows/macOS/iOS/Android

    密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。