首页 > 作文

java分布式面试降级组件Hystrix的功能特性

更新时间:2023-04-06 02:35:05 阅读: 评论:0

引言

关于 hystrix 的问题汇总后两点:

hystrix主要功能覆盖考察。hystrix工作中使用经验考察。

hystrix语义为“豪猪”,它后背带刺儿且具有自我保护的能力,这是不是就很好理解它的功能了。虽然我没有直接使用过hystrix,但是类似的同样功能的框架功能和原理都大同小异,所以我决定针对 hystrix 单独拆分开讲解。

同时我觉得hystrix中有很多设计思想非常优秀,非常值得我们学习,学习这些设计思想,你可以从更高维度去思考如何让系统更加稳定。

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的机制后,我马上在项目中用起来。

看真实例子:

代码解释:

fallbackmethod = “getorderbyparamfrommysql”

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

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

线程隔离:

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

信号量隔离:

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

对于延迟小的请求(例如访问缓存或者本地访问数据库)来说,线程池带来的开销是非常高的,你可以考虑采用其他方法,例如非阻塞信号量(不支三八妇女节祝福词持超时)来实现依赖服务的隔离。但绝大多数情况下,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 的使用

代码解释:

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

哪些情况下会触发fallback?

failure typeexception classexception.cau触发fallbackfailurehystrixruntimeexceptionunderlying exception (ur-controlled)yesmaphore_rejectedhystrixruntimeexceptionj.l.runtimeexceptionyesshort_circuitedhystrixruntimeexceptionj.l.runtimeexceptionyesthread_pool_rejectedhystrixruntimeexceptionj.u.c.rejectedexecutionexceptionyestimeouthystrixruntimeexceptionj.u.c.timeoutexceptionyes

failure:任意runtimeexception异常都可以激活fallback。

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

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

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

timeout:即超时请求。

附录:hystrix策略配置

其他常用限流降级组件

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

resilience4j:也是一个轻量级的容错组件,其灵感来自于 hystrix,但主要为 java 8 和函数式编程所设计。轻量级体现在其只用 vavr库(前身是 javaslang),没有任何外部依赖。而 hystrix 依赖了 archaius ,archaius 本身又依赖很多第三方包,例如 guava、apache commons configuration 等。

ntinel 与 hystrix resilience4j 对比

ntinelhystrixresilience4j隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离熔断降级策略基于响应时间、异常比率、异常数等异常比率模式、超时熔断基于异常比率、响应时间实时统计实现滑动窗口(leaparray)滑动窗口(基于 rxjava)ring bit buffer动态规则配置支持多种配置源支持多种数据源有限支持扩展性丰富的 spi 扩展接口插件的形式接口的形式基于注解的支持支持支持支持限流基于 qps,支持基于调用关系的限流有限的支持rate lim行为主义iter集群流量控制支持不支持不支持流量整形支持预热模式、匀速排队模式等多种复杂场景不支持简单的 rate limiter 模式系统自适应保护支持不支持不支持控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统多语言支持java / c++javajava开源社区状态活跃停止维护较活跃

至于如何选择,个人觉得,只要满足需求掌握使用理念,选技术文档最多最全的一种即可,你最熟悉的就是最适合你的。

总结

hystrix 框架提供了高可用相关的各种各样的功能,有了 hystrix 的保护,整个系统可以长期处于高可用的状态。

这一小节的内容不仅仅是学会 hystrix 这门工具的使用,更重要的是理解降级的设计理念,即便 hystrix 官方已经停止维护更新,但不可否定 hystrix 是一个优秀的生产力工具。

以上就是java分布式面试降级组件hystrix的功能特性的详细内容,更多关于java分布式面试降级组件hystrix的资料请关注www.887551.com其它相关文章!

本文发布于:2023-04-06 02:35:02,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/51f08c513ef37dc6b17815116829ffa7.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java分布式面试降级组件Hystrix的功能特性.doc

本文 PDF 下载地址:java分布式面试降级组件Hystrix的功能特性.pdf

下一篇:返回列表
标签:线程   信号量   异常   机制
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图