zoukankan      html  css  js  c++  java
  • 【赶快收藏】Hystrix实战,优雅提升系统的鲁棒性

    背景

    最近接手了一个系统,其功能都是查询。查询分了两种方式,一种是公司集团提供的查询能力,支持全国各个省份的查询,但是业务高峰期时服务响应比较慢;另外一种是各省的分公司都分别提供了对应的查询能力,但是服务质量相对较差,业务高峰期服务超时较多,而且分公司系统升级时也会影响服务质量。为了提升服务查询的成功率,可以将两种查询方式结合起来。比较完备方案就是优先使用各省分公司提供的服务,当分公司的服务质量下降后降级到公司集团对应的服务。很早就听过Hystrix,用在现用系统服务质量提升的改造上,再适合不过了。

    Hystrix简介

    Hystrix是Netflix开源的一款容错系统, 能帮助开发者码出具备强大的容错能力和鲁棒性的程序!

    Hystrix功能

    1、对依赖的服务(HTTP调用、SOA服务)进行保护, 并且把控住由于依赖服务所带来的的延迟和失败。

    2、防止在一个复杂的分布式系统里出现级联失效(cascading failures)。

    3、快速失败(Fail fast),并且快速恢复依赖服务。

    4、优雅的降级。

    5、实时的监控和报警。

    健康状态系统

    请求被阻塞系统

     任何的RPC都可能会面临三种情况:成功、失败、超时。如果一次用户请求所依赖外部服务(A,H,I,P)有任何一个不可用,就有可能导致整个用户请求被阻塞。考虑到应用容器的线程数目基本都是固定的,当在高并发的情况下,某一外部依赖的服务超时阻塞,就有可能使得整个主线程池被占满 线程池被占满就会导致整个服务不可用,而依赖该服务的其他服务,就又可能会重复产生上述问题。因此整个系统就像雪崩一样逐渐的扩散、坍塌、崩溃了!

    舱壁隔离模式(Bulkheads)

    货船为了进行防止漏水和火灾的扩散, 将船的底部划分成一个个的舱室, 这样一个舱室进水不会导致整艘船沉没。

    服务雪崩

     

    隔离架构

    降级-触发fallback

    1、run()/construct方法抛出非HystrixBadRequestException异常

    2、run()/construct()运行超时

    3、熔断器启动

    4、线程池/信号量拒绝

    隔离策略

    线程池隔离:会带来线程开销

    Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ThreadPoolTestGroup"))
          .andCommandKey(HystrixCommandKey.Factory.asKey(“testCommandKey"))
            //与其他命名的线程池天然隔离
          .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolTest")) 

    信号量隔离:服务的并发数大于信号量阈值时将进入fallback 采用资源计数法,TryableSemaphore

    .andCommandPropertiesDefaults(  // 配置信号量隔离
        HystrixCommandProperties.Setter()
          .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
        .withExecutionIsolationSemaphoreMaxConcurrentRequests(3)
             // fallback(降级)调用最大的并发数
        .withFallbackIsolationSemaphoreMaxConcurrentRequests(10))

    熔断器

    熔断相当于家里电压过大电路的跳闸功能, 跳闸可以保护我们的电器, 在代码中类比就是将调用的服务直接给屏蔽了, 不再调用调用远程服务器的服务 举个栗子,配置熔断策略为 当请求错误比例在5s内>50%时, 该服务将进入熔断状态。

    熔断器默认工作时间,默认:5秒, 熔断器中断请求5秒后会进入半打开状态, 放部分流量过去重试。

    熔断器的开关能保证服务调用者在 调用异常服务时, 快速返回结果, fail fast or fallback static,避免大量的同步等待 并且熔断器能在一段时间后 继续侦测请求执行结果, 提供恢复服务调用的可能。

     

    请求结果cache

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

     Hystrix设计点

    • 资源隔离
    • 熔断器模式
    • 命令模式
    • 观察者模式
    • RxJava

     

    自助服务系统查询改造方案

    命令调用模式,省端直连接口;降级调用模式,集团电商接口。

    自助服务整合Hystrix后系统请求流程图。

    参考链接

    http://www.jianshu.com/p/b9af028efebb

    https://github.com/Netflix/Hystrix/wiki

    https://github.com/Netflix/Hystrix/wiki/How-To-Use

    https://segmentfault.com/a/1190000005988895

    http://kriszhang.com/hystrix_defend_your_webapp

    https://blog.51cto.com/snowtiger/2057092

  • 相关阅读:
    javaweb:Filter过滤器
    javaScript:高级
    javascript:基础
    Boostrao:轮播图
    Bootstrap案列:首页界面
    Bootstrap学习笔记
    javaweb:respone
    javaweb:jsp
    五、结构型模式--->07.享元模式
    五、结构型模式--->06.组合模式
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/11570189.html
Copyright © 2011-2022 走看看