Hystrix Fallback方法执行

时间:2017-08-31 12:17:14

标签: spring-boot hystrix circuit-breaker

以下是我的Hystrix命令配置:

@HystrixCommand(fallbackMethod = "fall", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
            @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000") })
    public <T> T getInfo(Class clazz) {....}

后备法:

public <T> T fall(Class clazz) {
        System.out.println("fallback");
        throw new CustomRuntimeException("API Down"); 
    }

据我所知,按照以下配置,即

@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000") }
在10秒内允许5个请求,直到电路开启并且第5个请求的每个请求都将被拒绝,并且因为我在回退方法中抛出异常,它将被包装为HystrixRuntimeException

但我面临以下问题:

  • 在电路跳闸之前,回退正常执行 抛出CustomRuntimeException(注意:Hystrix Command方法也是如此 抛出CustomRuntimeException
  • 电路开路后我得到Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: getInfo short-circuited and fallback failed.

问题

  1. 为什么在电路打开之前异常没有被包装为HystrixRuntimeException,即当前正常执行回退并抛出CustomRuntimeException直到电路打开?*
  2. How Hystrix works

    1. 为什么在流程1-&gt; 2-&gt; 3-> 4-> 5->&gt; 6-&gt; 8中执行回退方法 失败(即投掷CustomRuntimeException)并且不投掷 包裹的HystrixRuntimeException,在流动的情况下发生 1-> 2-> 3-> 4-> 8和1-> 2-> 3-> 5-> 8

1 个答案:

答案 0 :(得分:2)

请参阅Hystrix Javanica文档以了解异常处理:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#error-propagation

引用文档:

&#34;值得注意的是,默认情况下,调用者将始终获得根本原因异常...从不HystrixBadRequestException或HystrixRuntimeException&#34;

&#34;如果命令有后备,则只有第一个触发回退逻辑的异常将传播给调用者。&#34;

这两个引号回答了你的第一个问题:第一个方法的异常将抛出异常,而不是HystrixRuntimeException。永远不会显示回退中抛出的异常。

当断路器打开时,将抛出RuntimeException。同样,后备中抛出的异常将永远不会显示。

我为此写了一个测试用例:https://github.com/ahus1/hystrix-spring-examples/blob/master/src/test/java/de/ahus1/hystrixspring/HystrixExceptionHandlingInSpring.java

附注:

  1. 您已将cicruit破坏程序的配置添加到代码中。它们通常更适合弹簧配置,其全名为hystrix.command.default.circuitBreaker.requestVolumeThreshold

  2. requestVolumeThreshold的工作方式与您描述的略有不同:它定义了允许cicruit断路器触发之前在时间窗口中所需的最小请求数。 errorThresholdPercentage是一旦达到最小请求数(在您的情况下为5)时允许的错误百分比。在你的情况下,5个呼叫中有5个失败,即100%。 100%大于50%(断路器的默认值),因此它会打开。