[JD] 五、服务容错方案

[JD] 五、服务容错方案

一、服务容错应用场景分析与设计
二、熔断组件Hystrix分析
三、Hystrix服务熔断降级应用

一、服务容错应用场景分析与设计
1.服务容错的意义及容错要解决的问题
    单个节点故障可能被无限向上放大
    同一个分组下的接口被一个调用方压垮、影响到其他调用方,即多租户相互影响
    瞬时流量激增,系统压力大
    
2.解决方案
    1> 资源隔离
        可以针对线程资源隔离,比如将请求的接口设置单独的线程池
        可以使用信号量,做到限制上限,控制并发
        尤其将重保的业务设置单独的分组

    2> 服务熔断
        临时关闭某些功能的调用,个别业务不可用,整体系统可用
    3> 服务降级
        调用方服务自己设置调用失败的兜底策略
        
3.服务熔断需要考虑哪些?
    需要考虑哪些服务可以垄断、熔断的触发机制(主动or被动)、熔断的恢复时机与机制
    断路器是服务熔断的开关:当对下游服务调用异常量达到设定的阈值后,打开断路器,可以触发熔断
  3.1 实现断路器的技术要点
        断路器的控制逻辑没
        阈值和统计数据,即如何使用统计后的数据,准确地控制熔断状态,减少误判
  3.2 断路器的状态流转设计
    1> 断路器涉及的状态有 关闭状态、打开状态和半打开状态
    2> 状态流转:
        当调用量都达到设定阈值后,断路器由关闭状态变为打开状态;
        当断路器达到关闭窗口期时,由打开状态变为半打开状态;
        当断路器在半打开状态时,开始试探请求,如果调用失败,再由半打开状态变为打开状态;
        当断路器在半打开状态时,开始试探请求,如果调用成功,断路器由半打开变成关闭状态。
      细节:
        状态值的修改需要考虑到用CAS
        在创建新的bucket时,再考虑是否改变状态
  3.3 阈值和统计数据设计
    1> 关于时效性的考虑,可以使用滑动窗口统计某一段时间的调用
    2> 数据结构的选择可以使用循环数组。通过取模确定某一时段统计数据存储的位置
    3> 数组的每个bucket里面存放,窗口开始时间(WindowStart)、调用失败次数(FailNum)、调用成功次数(SuccessNum)、窗口期(window time)
    4> 在循环数组的数据结构中,可以设置bucket数组、数组的头尾指针、数组的默认大小以及数组的最大长度

    5> 主要计算方法逻辑
        添加 bucket 的逻辑(addBucket):data[tail] = bucket; incrTail();
        变更指针逻辑:当元素个数 == 数组长度,即元素个数达到窗口大小时,头指针和尾指针都加1向后滑动(取模);当元素个数没有达到窗口大小时,尾指针向后移动
        尾部bucket元素的获取逻辑:当数组元素个数为0,返回null;尾部元素index = (head + dataLength - 1) % dataLength;return data[index];
        获取所有bucket元素(按时间点由远到近):index = (head + i) % dataLength; // 遍历获取 dataLength 次元素

4.服务降级需要考虑哪些?
    需要考虑可以降低的服务、降级的方法、降级触发的机制(发生熔断 or 调用超时或异常)
    注:服务降级可以不需要考虑恢复机制,因为被调用服务可用的时候,自动就不会走到降级策略。
    
  综上,熔断降级的目标是一致,都是从可用性和可靠性出发,为了防止系统崩溃。

二、熔断组件Hystrix分析
1.Hystrix 解决的问题
    阻止某个有问题的调用耗尽系统的所有线程
    阻止错误在分布式系统之间的传播
    快速失败,代替请求排队
    错误回退、优雅的服务降级
2.依赖隔离
    包装调用逻辑,每个命令在单独的线程池中执行;
    可配置依赖调用时间,当调用超时时后,执行fallback逻辑;
    线程池已满,调用将被立即拒绝;
    依赖调用失败后执行fallback逻辑;
    提供熔断器组件,可以自动运行或者手动调用
3.主要特性
    资源隔离:限制调用服务使用的资源,当某一下游服务出现问题时,不会影响整个调用链
    熔断机制:当失败率到达阈值,自动触发熔断保护,熔断器打开,不再进行调用
    降级机制:超时或者资源熔断后,调用预设的降级接口返回兜底策略数据
4.hystrix执行逻辑

三、Hystrix服务熔断降级应用
1.熔断降级配置
    继承 HystrixCommand 类
    通过 addThreadPoolPropertiesDefaults 配置线程池,注意要设置足够的线程数
    通过 addCommandPropertiesDefaults 配置熔断器
        withCircuitBreakerEnabled(true) // 熔断器生效
        withCircuitBreakerRequestVolumeThreshold(3) // 表示10秒内请求超过3次触发熔断
        withCircuitBreakerErrorThresholdPercentage(80)
        withCircuitBreakerForceOpen(true) // 设置为true时,所有请求直接fallback
        ...
    注:配置信号量隔离后,使用线程池隔离的方式将失效
2.通过 HystrixCommand 注解 结合 配置中心动态调整参数


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值