服务降级 vs 服务熔断

From: http://www.cnblogs.com/rjzheng/p/10340176.htmlhtml

什么是服务熔断?java

    当下游服务不可用或者响应缓慢, 则阻止进一步调用目标服务, 而是直接返回,快速释放资源, 直到目标服务恢复,再继续调用它。框架

    熔断是一个框架级的处理, 基本的处理方式:断路器模式。。。。异步

    熔断器的状态: Closed Open Half-Open。微服务

    若是失败比例达到阈值,则开始熔断器 Closed -> Open
    打开的时候, 有个reset timeout, 若是到了这个时间, 状态会变为Half-Open。 Closed -> Half-Open 
    处于Half-Open状态时, 会尝试将一部分请求调用下游服务, 若是能够成功调用下游服务, 则关闭熔断器 Half-Open -> Closed; 若是仍然不能成功调用,则继续开启熔断器 Half-Open -> Openui

    在Hystrix 中, 配置:
    // 滑动窗口, 即 调用次数
    circuitBreaker.requestVolumeThreshold=20
    // 多长时间后,开始进入半开启状态
    circuitBreaker.sleepWindowInMilliseconds=5000
    // 服务调用错误率
    circuitBreaker.errorThresholdPercent=50%htm

    上述配置的意思是每20个请求中, 调用失败次数超过50%,就开启熔断器。过了5秒以后, 尝试调用目标服务, 根据结果判断熔断器开始或者关闭。blog

什么是服务降级?事件

    先说2个场景:ci

        下游服务因为某种缘由响应过慢,下游服务主动停掉一些不过重要的业务, 释放服务资源, 增长响应速度。
        下游服务因为某种缘由不可用, 上游主动调用本地一些降级逻辑, 避免卡顿, 迅速将结果返回给用户。

    这样2个场景并没以为和熔断有啥区别, 做者说能够理解为:服务降级有不少方式,好比限流降级、开关降级、熔断降级;而服务熔断只不过是服务降级的一种方式

    好比, 上游代码:

    try{
        // 调用下游服务
        xxRpc.helloWorld();
    } catch(Exception e){
        // 由于熔断, 而抛出异常
        doSomething();
    }

    下游的helloWorld服务由于熔断而调用不一样(抛出异常)。此时上游服务会进入catch代码块, 那么doSomething执行的逻辑就是降级逻辑。

    服务降级更多的属于业务级别的降级。在配置中心更改开关, 决定哪些服务降级。至于配置变更后, 应用怎样监控配置变化, 应该用到Rxjava之类的了。

    在应用中, 添加用于降级使用的开关,也能够叫作埋点。。。。

    那么埋点的形式是啥呢?

        简化执行流程:本身梳理核心流程和非核心流程,而后在非核心流程上加开关, 一旦发现系统扛不住, 经过开关关掉那些非核心流程。

        关闭次要功能: 同简化流程

        下降一致性: 发现都是核心流程,没法简化流程, 那只能下降一致性, 也就是将核心流程的同步改成异步, 强一致性改成最终一致性。

        上面3个都是手动降级, 怎么实现自动降级??通常降级场景能够预见,好比某某活动。有突发事件、流量异常也会有监控邮件通知, 提供咱们手动降级。

        固然,这并不表明不能自动降级。。。。

        自动降级思路:先设置预警阈值;监控是否达到阈值,若是达到阈值, 则更改配置中心的配置(启动开关降级);配置中心监测到配置的变化, 则会推送这些变化到相应的微服务(PS: 配置中心具备热刷新功能)。

相关文章
相关标签/搜索