我们有一个Hystrix(1.4.x)命令,如下所示(使用Spring):
@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
return externalService.findXsExternally(xId);
}
实际上,我们不希望List
从fallback方法返回一个(空),而是抛出一个异常,以便我们的调用者findXs
知道the externalService
down并可以采取相应的措施。但是同时,我们想利用Hystrix提供的功能。
在我们的例子中,我们希望调用者返回错误消息而不是返回列表。在Spring中,回退的实现方式如下:
public List<X> myFallback(long xId) {
// What to do?? Throw exception!?
}
从myFallback
“作品”中抛出异常,但Hystrix将警告我们:
CommandKey失败,回退失败。
即它将解释为回退失败。在我们的情况下,异常应不被解释为后备失败而是预期的行为。我们还尝试了将抛出的异常包装在中,HystrixBadRequestException
但它似乎不适用于后备(根据文档,该方法适用于“运行”方法)。
如何在Hystrix中实现抛出异常的后备方法?我们可以安全地忽略警告吗,还是Hystrix并非以这种方式设计的?
如果不想使用后备,为什么还要设置后备呢?Hystrix不需要您设置一个。当您宁愿从缓存中返回陈旧数据(而不是引发异常)时,可以使用后备。两种情况均视为Hystrix的失败。如果要从fallback方法中引发异常,则只会混淆Hystrix,Hystrix会认为您的fallback除了服务本身之外还存在错误。如果您不提供后备广告,则Hystrix应该引发HystrixBadRequestException,包装从findXs方法引发的异常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句