• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

分布式服务防雪崩熔断器,Hystrix理论+实战。

技术杂谈 勤劳的小蚂蚁 3个月前 (02-02) 76次浏览 已收录 0个评论 扫描二维码

Hystrix是什么?

hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象做作为logo。
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

为什么需要Hystrix?

在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:
在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务脱机等。
如下图:QPS为50的依赖 I 出现不可用,但是其他依赖仍然可用。
当依赖I 阻塞时,大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性.如下图:
在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。
  1. 例如:一个依赖30SOA服务的系统,每个服务99.99%可用。  
  2. 99.99%的30次方99.7%  
  3. 0.3%意味着一亿次请求会有3,000,00次失败  
  4. 换算成时间大约每月有2个小时服务不稳定.  
  5. 随着服务依赖数量的变多,服务不稳定的概率会成指数性提高.
解决问题方案:对依赖做隔离,Hystrix就是处理依赖隔离的框架,同时也是可以帮我们做依赖服务的治理和监控。
Netflix 公司开发并成功使用Hystrix,使用规模如下:
  1. TheNetflix API processes 10+ billion HystrixCommand executions per day using thread isolation.  
  2. Each API instance has 40+ thread-pools with5-20 threads in each (most are set to 10).

Hystrix如何解决依赖隔离?

  1. Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。
  2. 可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑。
  3. 为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。
  4. 依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。
  5. 提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。
提供近实时依赖的统计和监控。
Hystrix依赖的隔离架构,如下图:

Hystrix应用实战

Maven
  1. <dependency>
  2.    <groupId>com.netflix.hystrix</groupId>
  3.    <artifactId>hystrix-core</artifactId>
  4.    <version>1.5.13</version>
  5. </dependency>
源码太多,不一一贴上来,这里只展示主要的测试源码。
  1. publicstaticvoid main(String[] args){
  2.    System.out.println(test("javastack"));
  3. }
  4. privatestaticString test(String name){
  5.    HystrixUtil.HystrixReqConfig hc =HystrixUtil.HystrixReqConfig.withGroupKey("TestGroup").withTimeout(3)
  6.            .withUnit(TimeUnit.SECONDS).withPassNum(64);
  7.    String result =HystrixUtil.getExcuteResult(newHystrixCallableService<String>(){
  8.        @Override
  9.        publicString execute(){
  10.            try{
  11.                Thread.sleep(5000);
  12.            }catch(InterruptedException e){
  13.                e.printStackTrace();
  14.            }
  15.            return"success "+ name;
  16.        }
  17.        @Override
  18.        publicString fallback(){
  19.            return"fallback "+ name;
  20.        }
  21.    }, hc);
  22.    return result;
  23. }
这里设置了3秒超时进入熔断。
测试程序中休眠5秒,进入熔断器并输出:
  1. fallback javastack
测试程序中休眠2秒,进入正常流程并输出:
  1. success javastack
熔断器测试成功,即使某个服务出问题,也不会影响整个系统的正常运行。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:分布式服务防雪崩熔断器,Hystrix理论+实战。
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00