我正在使用一些微服务系统和一个通过AutoRest Generated Clients进行通信的Orchestrator工作。我在调用Orchestrator时遇到问题,Orchestrator进行依赖调用,如果依赖失败,则自动休息重试3次。现在这通常会很好但是因为Orchestrator收到一个失败的响应,它将重试3次,这将重试下游服务3次,每次调用9次。
我已经考虑过以下解决方案,允许下游服务失败并正常返回500内部服务器错误。如果重试失败并且我们收到的最终响应代码是瞬态响应代码,我们将其转换为502.我已经创建了一个自定义的ITransientErrorDetectionStrategy,它不会在502上重试,因此当协调器回放502响应代码时,不重试orchestrator请求。
我的ITransientErrorDetectionStrategy看起来如下:
public class DownStreamFailureStrategy : ITransientErrorDetectionStrategy
{
public bool IsTransient(Exception ex)
{
HttpRequestWithStatusException httpException;
if ((httpException = ex as HttpRequestWithStatusException) != null)
{
if (httpException.StatusCode == HttpStatusCode.RequestTimeout||
(httpException.StatusCode >= HttpStatusCode.InternalServerError &&
httpException.StatusCode != HttpStatusCode.NotImplemented &&
httpException.StatusCode != HttpStatusCode.HttpVersionNotSupported &&
httpException.StatusCode != HttpStatusCode.BadGateway))
{
return true;
}
}
return false;
}
}
我遇到的问题是将现有的500响应转换为502,我不想将其留给调用代码来执行此操作,而是将其构建到客户端。我一直在寻找构建自定义RetryDelegatingHandler,但我不确定如何在我的客户端工厂中使用它。
答案 0 :(得分:0)
您还可以通过更改RetryPolicy来更改重试次数。
public partial class YourAutoGeneratedClient
{
partial void CustomInitialize()
{
var retryPolicy = new RetryPolicy<TransientErrorIgnoreStrategy>(0);
SetRetryPolicy(retryPolicy);
}
}