【问题标题】:Can we use Spring-cloud-netflix and Hystrix to retry failed exectuion我们可以使用 Spring-cloud-netflix 和 Hystrix 重试失败的执行吗
【发布时间】:2015-08-09 13:25:44
【问题描述】:

我正在使用 Spring-Cloud-netflix 库。

我想知道是否有一种方法可以获取此代码并添加配置它而不是立即执行回退方法以重试执行N次并且在N次的情况下执行回退方法:

 @HystrixCommand(fallbackMethod = "defaultInvokcation")
    public String getRemoteBro(String name) {
        return(executeRemoteService(name));
    }

     private String defaultInvokcation(String name) {
   return "something";
}

谢谢, 射线。

【问题讨论】:

  • 我不认为这是 hystrix 的工作。负责远程请求行为的更多是您的executeRemoteService。将此方法扩展为“loop{success?return : try again} throw RequestAmountExceededException”
  • 啊。好点子。可以请用答案证明这一点吗?我会将其标记为已回答。谢谢。

标签: java spring spring-boot spring-cloud hystrix


【解决方案1】:

来自我的comment

在您的代码中处理此行为。知道你的“特殊”业务逻辑不是 hystrix 的工作。举个例子

private final static int MAX_RETRIES = 5;

@HystrixCommand(fallbackMethod = "defaultInvokcation")
public String getRemoteBro(String name) {
    return(executeRemoteService(name));
}

private String executeRemoteService(String serviceName) {
    for (int i = 0; i < MAX_RETRIES; i++) {
        try {
            return reallyExecuteRemoteService(serviceName);
        } catch (ServiceException se) { 
          // handle or log execption
        }
    }
    throw new RuntimeException("bam");
}

不知道您是否喜欢在循环中使用异常;)您也可以将来自reallyExecuteRemoteService的答案包装在某种带有状态代码的 ServiceReturnMessage 中。

【讨论】:

  • 啊,我以为我可以在 Hystrix 异常处理中处理这个问题。不是我的服务例外
  • 正如我试图表达的那样:Hystrix 检查您的服务执行,如果出现故障,从 hystrix 的角度来看它只是失败。因此,必须是您调用的服务中的逻辑。对于 hystrix 而言,确定服务(远程端)是否已死或只需要再次询问(只是一个想法:可能基于您调用的异常类型)将非常复杂。
  • 如果 Hystrix 可以在执行默认方法之前有一个重试机制那就太好了(不管失败的原因是什么)
  • 如果有可能你必须记住,这会带来更多的问题/配置需求。就像重试调用之间的重试次数或超时一样。另一方面:如果您的调用在远程端执行繁重的工作(但以异常结束),您将成倍增加远程服务器上的负载,即使您可以确定每次运行都会失败。在断路器激活之前,没有机制可以阻止它。
  • 我听到了。你认为你可以用 rxjava 模式“升级”你的答案,而 hystrix 与该解决方案有关吗?使用订阅..因为我认为如果我可以在例外情况下订阅 Oberservable,我可以决定做什么
猜你喜欢
  • 2016-03-31
  • 2015-08-31
  • 2017-07-23
  • 2017-09-10
  • 2020-09-13
  • 2016-07-04
  • 2017-04-04
  • 2015-05-31
  • 2017-07-08
相关资源
最近更新 更多