我正在尝试将Hystrix实施到我们的微服务项目中。为了使问题简单明了,我将描述下面的场景:
(a)对有时执行缓慢的后端服务的呼叫(例如支付服务)
(b)我已经使用@Hystrix注释了该方法(从我拨打付款服务的地方)。另外,我已经实现了相应的回退方法。
(c)下面是相同的代码片段。
@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 ms) 因此Hystrix调用fallbackProcessPayment(...),但我也看到后端支付服务也会被执行,尽管速度很慢。 这是不受欢迎的行为,因为付款正在后台处理,因为我还通知用户(通过回退方法)我们无法处理付款(因为呼叫已超时,因为paymentService需要4秒才能响应,而Hystrix预计响应时间为2秒(基于timeoutInMilliseconds配置)。
是否有任何我缺少的配置才能使其正常工作?
任何指向此的指针都会有很大的帮助。
感谢您的时间
答案 0 :(得分:0)
好。这是hystrix的预期行为。你有几个选择。
1.要么增加超时
2.在后备方法中,检查方法失败的原因是什么。即哪个例外。 (您可以通过在类型为Throwable
的回退方法中添加一个参数来了解这一点,该方法将触发回退方法的异常。如果失败是由于超时,则可以在返回响应之前编写一段代码以检查先前的进程是否已完成。
但是第二种方法是不可行的,因为如果您将阈值设置为5并且由于连续超时导致5个请求失败,则第6个请求将直接转到您的回退方法。在哪里检查先前的过程是否完成没有意义。