Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 微服务应该如何处理409响应?_Http_Error Handling_Microservices_Error Code - Fatal编程技术网

Http 微服务应该如何处理409响应?

Http 微服务应该如何处理409响应?,http,error-handling,microservices,error-code,Http,Error Handling,Microservices,Error Code,考虑两个微服务“A”和“B”。假设“A”对“B”进行POST调用,“B”执行基于某个id检查重复请求的操作。如果操作成功,“B”返回200 OK响应。如果“B”发现请求是重复的,它将返回409 现在考虑一个场景,其中“A”对“B”进行后调用。“B”成功处理,但在它能够响应之前,连接超时,“A”接收到504超时错误代码。当服务“A”重试请求时,这次“B”将其识别为重复请求,并返回409响应,因为它已成功处理了“A”发出的第一个请求。在这种情况下,服务“A”会认为这是一个不可恢复的错误,还是应该认为

考虑两个微服务“A”和“B”。假设“A”对“B”进行POST调用,“B”执行基于某个id检查重复请求的操作。如果操作成功,“B”返回200 OK响应。如果“B”发现请求是重复的,它将返回
409

现在考虑一个场景,其中“A”对“B”进行后调用。“B”成功处理,但在它能够响应之前,连接超时,“A”接收到

504
超时错误代码。当服务“A”重试请求时,这次“B”将其识别为重复请求,并返回
409
响应,因为它已成功处理了“A”发出的第一个请求。在这种情况下,服务“A”会认为这是一个不可恢复的错误,还是应该认为这是成功的(假设它的第一个请求得到成功处理)? …“B”将此识别为重复请求并返回409 在这种情况下,服务应该是“A”。 不可补救的错误,还是应该认为这是成功的…… 打电话的人能否得出肯定的结论,即409状态是由他们上次打电话的“成功”引起的,还是由另一种“冲突”引起的?我不知道,但我可能不希望我的处理依赖于此


任何4xx响应状态是否应被视为“可重试”值得怀疑。在我看来,处理应该假设呼叫永久失败。

我从您的Q中了解到,即使发生超时,B也会将下一个呼叫识别为重复呼叫。首先,不要指望它会成功。我宁愿去寻找那个状态在哪里维持?它存储多长时间?在超时事件中,该状态可以被释放,或者必须从a到B触发检查,以了解该事务是否实际成功?。例如,A发布客户信息,B超时。现在,在重试之前,调用getCustomerInfo(cusomerName,customerId,x,y,z,…)来验证即使发生超时,Post最终还是成功的

此外,您可能希望深入了解等待时间有多长,B的重复Id状态,以及您是否可以与B团队合作提前发布该Id以继续


我还看到了一个在microservice A和B团队之间进行编排的机会,在这种情况下,排队服务可能非常有益(只有在这种情况经常发生的情况下)

有时,网络故障可能会导致连接重置,这可能会导致向调用者返回5xx代码(“a”)。在这种情况下,微服务“B”可能无法知道调用者(“A”)没有得到2XX,而是得到了5XX代码。@adi我同意可能会发生这种情况。但是,正如您在问题中指出的那样,网络故障很少发生,并且由重试策略处理。然而,我已经删除了我答案的第一部分,因为它脱离了主题。