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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

互联网编程 2017-12-26 14:22:00 浏览426
展开阅读全文
img_1bd90ae2439530e8a953ae5ec55c3588.png
image.png

Hystrix是什么?

hystrix对应的中文名字是“豪猪”,豪猪周身长满了刺,能保护自己不受天敌的伤害,代表了一种防御机制,这与hystrix本身的功能不谋而合,因此Netflix团队将该框架命名为Hystrix,并使用了对应的卡通形象做作为logo。

在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

为什么需要Hystrix?

在大中型分布式系统中,通常系统很多依赖(HTTP,hession,Netty,Dubbo等),如下图:


img_747214252ea38cf1c7889ec4f6d430af.png
image.png

在高并发访问下,这些依赖的稳定性与否对系统的影响非常大,但是依赖有很多不可控问题:如网络连接缓慢,资源繁忙,暂时不可用,服务脱机等。

如下图:QPS为50的依赖 I 出现不可用,但是其他依赖仍然可用。
img_769f211782377b5fb980207b29231e80.png

当依赖I 阻塞时,大多数服务器的线程池就出现阻塞(BLOCK),影响整个线上服务的稳定性.如下图:

img_073be9cc9a4c5911efab2fafb6aa73a5.png

在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。


img_99c6348f71c68f137e5e155479f8f084.png

解决问题方案:对依赖做隔离,Hystrix就是处理依赖隔离的框架,同时也是可以帮我们做依赖服务的治理和监控。

Netflix 公司开发并成功使用Hystrix,使用规模如下:
img_52c1b462aa1df21be64368788a4c694e.png

Hystrix如何解决依赖隔离?
Hystrix使用命令模式HystrixCommand(Command)包装依赖调用逻辑,每个命令在单独线程中/信号授权下执行。

可配置依赖调用超时时间,超时时间一般设为比99.5%平均时间略高即可.当调用超时时,直接返回或执行fallback逻辑。

为每个依赖提供一个小的线程池(或信号),如果线程池已满调用将被立即拒绝,默认不采用排队.加速失败判定时间。

依赖调用结果分:成功,失败(抛出异常),超时,线程拒绝,短路。 请求失败(异常,拒绝,超时,短路)时执行fallback(降级)逻辑。

提供熔断器组件,可以自动运行或手动调用,停止当前依赖一段时间(10秒),熔断器默认错误率阈值为50%,超过将自动运行。

提供近实时依赖的统计和监控。

Hystrix依赖的隔离架构,如下图:


img_da8dca000d6c2c508f5480cfa655948e.png

Hystrix应用实战
Maven:

1.  <dependency>
2.      <groupId>com.netflix.hystrix</groupId>
3.      <artifactId>hystrix-core</artifactId>
4.      <version>1.5.13</version>
5.  </dependency>

源码太多,不一一贴上来,这里只展示主要的测试源码。

1.  public static void main(String[] args) {
2.      System.out.println(test("javastack"));
3.  }
4.  
5.  private static String test(String name) {
6.      HystrixUtil.HystrixReqConfig hc = HystrixUtil.HystrixReqConfig.withGroupKey("TestGroup").withTimeout(3)
7.              .withUnit(TimeUnit.SECONDS).withPassNum(64);
8.  
9.      String result = HystrixUtil.getExcuteResult(new HystrixCallableService<String>() {
10. 
11.         @Override
12.         public String execute() {
13.             try {
14.                 Thread.sleep(5000);
15.             } catch (InterruptedException e) {
16.                 e.printStackTrace();
17.             }
18.             return "success " + name;
19.         }
20. 
21.         @Override
22.         public String fallback() {
23.             return "fallback " + name;
24.         }
25. 
26.     }, hc);
27. 
28.     return result;
29. }


img_cc55a392e3a02ca808dda372bb500b3e.png

网友评论

登录后评论
0/500
评论
互联网编程
+ 关注