即使后端 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的主要内容,如果未能解决你的问题,请参考以下文章
即使凭据为真,Spring Boot Security 也会在 API 调用上引发 401 身份验证错误
即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝