即使后端 API 被执行,Hystrix 也会调用 fallbackMethod

Posted

技术标签:

【中文标题】即使后端 API 被执行,Hystrix 也会调用 fallbackMethod【英文标题】:Hystrix Calls the fallbackMethod even when backend API gets executed 【发布时间】:2017-10-19 20:38:25 【问题描述】:

我正在尝试将 Hystrix 实施到我们的微服务项目中。为了让问题简单明了,我将描述以下场景:

(a) 调用有时执行缓慢的后端服务(例如支付服务)

(b) 我已经用@Hystrix 注释了该方法(从我调用支付服务的地方)。另外,我已经实现了相应的回退方法。

(c) 下面是相同的代码 sn-p。

@HystrixCommand(fallbackMethod = "fallbackProcessPayment")
public String processPayment(User user) throws Exception
  
    // Call the payment service (which is slow in nature) to process the payment for the user....


 public String fallbackProcessPayment(User user)       
    // This is the fallback method for processPayment....
    // Gracefully handle the processPayment 


In the config.properties file timeout is configured as 
hystrix.command.getUseCase1.execution.isolation.thread.timeoutInMilliseconds=2000

当前行为 - 一旦从 processPayment(..) 方法调用后端支付服务,它需要的时间比我在 hystrix.command.getUseCase1.execution.isolation 中设置的时间长(~ 4000 毫秒)。 thread.timeoutInMilliseconds (2000 毫秒) 因此 Hystrix 调用 fallbackProcessPayment (...) 但我还看到后端支付服务也被执行的事实,尽管速度很慢。 这是不受欢迎的行为,因为付款正在后台处理,因为我还通知用户(通过后备方法)我们无法处理付款(因为调用超时,因为 paymentService 需要 4 秒才能响应而 Hystrix 预期2 秒内的响应(基于 timeoutInMilliseconds 配置)。

我是否缺少任何配置以使其正常工作???

任何指向此的指针都会有很大帮助。

感谢您的宝贵时间

【问题讨论】:

【参考方案1】:

嗯。这是 hystrix 的预期行为。您有几个选择。 1.要么增加超时时间 2. 在您的后备方法中检查该方法失败的原因是什么。即在哪个例外。 (您可以通过向Throwable 类型的回退方法添加一个参数来了解这一点,该方法将触发触发回退方法的异常)。如果失败是由于超时,那么您可以编写一段代码来检查前一个过程是否完成,然后再返回响应。

但是第二种方法不可行,因为,如果您将阈值设置为 5,并且如果 5 个请求由于连续超时而失败,那么第 6 个请求将直接转到您的回退方法。检查之前的过程是否完成没有意义。

【讨论】:

感谢 pvpkiran 的快速回复。很感激:-)你的观点#1对我来说完全有意义,但这也意味着用户体验将完全依赖于后端API调用,在这种特定情况下是支付服务。关于您提到的第二点,问题不是由于调用失败,而是由于后端调用成功但调用了回退方法。之所以调用 fallback,是因为 Hystrix 认为调用很慢(由于后端 API 实际上很慢),因此它超时了。 我同意。通过增加超时用户体验将受到阻碍。但这在同步通信(REST)的情况下是不可避免的。既然和支付有关,除了增加超时没有别的选择,如果是其他服务,我们可以只使用异步或非阻塞通信,例如将请求放入队列并进行处理。关于第 2 点,我知道调用没有失败,但 hystrix 认为它因为超时而失败。这是设计使然。 感谢 pvpkiran。我同意你的观点,对我来说很有意义。 如果有帮助,请点赞或接受答案。干杯:)

以上是关于即使后端 API 被执行,Hystrix 也会调用 fallbackMethod的主要内容,如果未能解决你的问题,请参考以下文章

hystrix 概述

即使凭据为真,Spring Boot Security 也会在 API 调用上引发 401 身份验证错误

即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝

跨域请求被阻止:即使在我的 API 上启用了 CORS 后也会发生;

阻塞的 Python 异步函数调用也会阻塞另一个异步函数

即使在 res.send 之后,代码也会被执行