教程:一起学习Hystrix--Hystrix处理异常机制(降级方法)

目录

  • 降级
  • 异常传递
  • 惊喜

Fallback(降级)

    我们可以通过增加一个 fallback (回退)方法在hystrix命令实现优雅降级,如果主命令失败,hystrix可以获取一个默认值或者值集合。我们可能想为更多的可能失败的hrstrix命令实现一个回退方法,但是会有以下几种例外:

  • 执行写操作的命令

            如果设计的hrstrix命令是执行一个写操作而不是返回一个结果(这个写操作在 HystrixCommand 通常返回 void,在 HystrixObservableCommand 返回一个空的可观察者),此场景下执行回退方法没有什么意义,如果写操作失败,服务方应该是希望告知调用方,让调用方再进一步处理。

  • 批处理系统/离线分析

             如果Hystrix命令正在填充一个缓存,或者生成一个报告,或者做任何离线计算。如果发生错误,通常应该将错误告知调用方,让调用方做进一步处理,而不应该发送一个默认的响应。

        如果命令执行异常,无论Hystrix命令是否有回退方法,hystrix命令状态、断路器/度量器都会更新为此条命令失败。

        在一个普通的HystrixCommand中通过重写 getFallback() 方法实现一个回退方法,比如  run() 方法有异常, hystrix会为所有类型的异常执行回退方法,比如 超时、线程池或信号量拒绝,以及断路器短路。 包含回退方法的示例如下:

public class HystrixHelloWorldFallback extends HystrixCommand<String> {
    private final String name;

    public HystrixHelloWorldFallback(String name) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.name = name;
    }

    @Override
    protected String run() {
        throw new RuntimeException("模拟异常!");
    }

    @Override
    protected String getFallback() {
        return "Hello Failure " + name + "!";
    }

}

点击查看带有单元测试的完整源码

    以上代码中 run()方法永远会出现异常,调用者永远接收到的是 getFallback()方法返回的值,不会接收到异常,以下单元测试成功:   

@Test
public void testSynchronous() {
       assertEquals("Hello Failure World!", new HystrixHelloWorldFallback("World").execute());
       assertEquals("Hello Failure Bob!", new HystrixHelloWorldFallback("Bob").execute());
}

    HystrixObservableCommand 等价方式

        对于HystrixObservableCommand,需要通过重写 resumeWithFallback 方法,如果执行失败了,它就会从主观察者接管失败返回第二可观察者。这里需要注意的是,已经发送的一个或多个数据项之后,可观察者可能会失败,所以回退方法不应该假设它会发送观察者看到的唯一值。

     在内部,Hystrix使用RxJava的 onerrorerrorenext操作符,在发生错误时,在主观察者和回退之间无缝切换。

    时序图

         @adrianb11  友好的提供了一个hystrix 超时回退时操作的时序图,点击查看

错误传播

    从run()方法抛出的除 HystrixBadRequestException 异常外的所有异常,会统计异常次数、触发回退方法和短路逻辑。

    可以将想抛出的异常包装到 HystrixBadRequestException通过 getCause() 方法查询它 ,HystrixBadRequestException适用于报告非法参数或非系统故障的场景,这些错误不应该与失败的指标相违背,也不应该触发回退逻辑。

        HystrixObservableCommand 等价方式

        在 HystrixObservableCommand例子中,不可恢复的错误通过 产生 ObservableonError 通知, 而下降是通过回到第二个可观察到的,即Hystrix通过您实现的恢复的回退方法获得的, 降级是下降到通过 Hystrix实现 resumeWithFallback 方法获得的第二个可观察完成的。

        执行异常类型列表

失败类型异常类异常原因是否执行回退
失败HystrixRuntimeException潜在异常(用户控制)执行
超时HystrixRuntimeExceptionj.u.c.TimeoutException执行
短路HystrixRuntimeExceptionj.l.RuntimeException  执行
线程池异常HystrixRuntimeExceptionj.u.c.RejectedExecutionException执行
信号量拒绝HystrixRuntimeExceptionj.l.RuntimeException执行
失败请求HystrixBadRequestExceptionunderlying exception (user-controlled)不执行

    惊喜

        转帖请注明原贴地址 : https://my.oschina.net/u/2342969/blog/1814990

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值