专栏首页Java技术栈分布式服务防雪崩熔断器,Hystrix理论+实战。

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

Hystrix是什么?

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

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

为什么需要Hystrix?

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

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

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

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

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

例如:一个依赖30个SOA服务的系统,每个服务99.99%可用。  
99.99%的30次方 ≈ 99.7%  
0.3% 意味着一亿次请求 会有 3,000,00次失败  
换算成时间大约每月有2个小时服务不稳定.  
随着服务依赖数量的变多,服务不稳定的概率会成指数性提高.

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

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

The Netflix API processes 10+ billion HystrixCommand executions per day using thread isolation.   
Each API instance has 40+ thread-pools with 5-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

<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
    <version>1.5.13</version>
</dependency>

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

public static void main(String[] args) {
    System.out.println(test("javastack"));
}

private static String test(String name) {
    HystrixUtil.HystrixReqConfig hc = HystrixUtil.HystrixReqConfig.withGroupKey("TestGroup").withTimeout(3)
            .withUnit(TimeUnit.SECONDS).withPassNum(64);

    String result = HystrixUtil.getExcuteResult(new HystrixCallableService<String>() {

        @Override
        public String execute() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "success " + name;
        }

        @Override
        public String fallback() {
            return "fallback " + name;
        }

    }, hc);

    return result;
}

这里设置了3秒超时进入熔断。

测试程序中休眠5秒,进入熔断器并输出:

fallback javastack

测试程序中休眠2秒,进入正常流程并输出:

success javastack

熔断器测试成功,即使某个服务出问题,也不会影响整个系统的正常运行。

本文分享自微信公众号 - Java技术栈(javastack),作者:javastack

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 这个函数,1987年在这了,别动它!

    http://www.apkbus.com/blog-873057-82068.html

    Java技术栈
  • 类、变量、块、构造器、继承初始化顺序,终极解答。

    最近发现微信群里面有些群友在讨论类的初始化顺序,如类的静态变量、成员变量、静态代码块、非静态代码块、构造器,及继承父类时,它们的初始化顺序都是怎样的,下面我通过...

    Java技术栈
  • Maven精选系列--依赖范围、传递、排除

    今天讲讲如何管理依赖,及依赖的范围、传递性等特征。 添加依赖 下面我添加了一个spring-web的依赖,maven就会去下载spring-web的jar包及...

    Java技术栈
  • 还在为线上服务 Docker 容器权限问题所烦恼吗,或许这款神器能助你彻底解决它!

    GoTTY 是一个简单的基于 Go 语言的命令行工具,它可以将你的终端(TTY)作为 Web 程序共享。GoTTY 的架构是基于 Hterm + Web Soc...

    iMike
  • 还在为线上服务Docker容器权限问题烦恼吗,或许这款神器能助你彻底解决它!

    GoTTY 是一个简单的基于 Go 语言的命令行工具,它可以将你的终端(TTY)作为 Web 程序共享。GoTTY 的架构是基于 Hterm + Web Soc...

    我的小碗汤
  • 【程序源代码】Spring boot的企业级报表框架

    Spring boot的企业级报表框架?人人权限系统集成UReport2报表引擎,renren-security采用SpringBoot2.0、MyBatis、...

    程序源代码
  • AngularJS系列之常用指令

    这节给大家介绍一下AngularJS中一些常用的指令,例如:ng-app、ng-init、ng-repeat、ng-model等等之类的指令。 那什么是Angu...

    林老师带你学编程
  • 先穿戴还是先设备?人类在升华自我生活方式的道路上不会止步

    镁客网
  • 四、Spring Cloud之熔断处理 Hystrix

    熔断处理什么呢?在微服务项目中,有很多的服务,在服务消费者调用服务提供者的时候可能会出现网络异常或者请求超时或者阻塞等等一系列问题,不过不进行处理的话,就可能导...

    程序员爱酸奶
  • 使用python实现可重入的公平读写锁

    在本项目中,读写锁主要应用于多线程服务器场景下的日志文件的读写,以及缓存的获取和更新。 多线程编程的准标准库posix pthread库拥有rwlock, 而p...

    py3study

扫码关注云+社区

领取腾讯云代金券