如何正确处理 Hystrix 回退中的预期错误?

How to properly handle expected errors in Hystrix fallback?

我们有一个 Hystrix (1.4.x) 命令,看起来像这样(使用 Spring):

@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
   return externalService.findXsExternally(xId);
}

我们实际上不想从后备方法中 return a (empty) List 而是抛出一个异常,这样 findXs 的调用者就知道 externalService 已关闭,可以采取相应的措施。但同时我们也想利用 Hystrix 提供的功能。

在我们的例子中,我们希望调用者 return 一条错误消息而不是 return 一个列表。在 Spring 中,回退是这样实现的:

public List<X> myFallback(long xId) {
    // What to do?? Throw exception!?  
}

myFallback 抛出异常“有效”,但 Hystrix 会警告我们:

CommandKey failed and fallback failed.

即它会将此解释为回退失败。在我们的例子中,异常应该 而不是 被解释为回退失败,而是预期的行为。我们还尝试将抛出的异常包装在 HystrixBadRequestException 中,但它似乎不适用于回退(根据 docs 这适用于“运行”方法)。

如何在 Hystrix 中实现抛出异常的 回退方法?我们可以安全地忽略警告吗?或者 Hystrix 不是这样设计的吗?

如果你不想使用它,为什么还要设置回退? Hystrix 不需要你设置一个。当您宁愿 return 缓存中的陈旧数据而不是抛出异常时,使用回退。这两种情况都算作 Hystrix 的失败。如果你要从 fallback 方法中抛出异常,你只会让 Hystrix 感到困惑,它会认为除了服务本身之外,你的 fallback 也有错误。如果你不提供回退,Hystrix 应该抛出一个 HystrixBadRequestException 来包装从你的 findXs 方法抛出的异常。