1

我正在开发一个带有一些微服务和一个通过 AutoRest 生成的客户端进行通信的 Orchestrator 的系统。当调用 Orchestrator 并且 Orchestrator 进行依赖调用时,我遇到了一个问题,如果依赖失败,它会通过 auto rest 重试 3 次。现在这通常没问题,但由于 Orchestrator 收到失败的响应,它将重试 3 次,这将重试下游服务 3 次,每次导致 9 个下游调用。

我想到了以下解决方案,允许下游服务失败并正常返回 500 Internal Server Error。如果重试也失败并且我们收到的最终响应代码是瞬态响应代码,我们将其转换为 502。我创建了一个自定义 ITransientErrorDetectionStrategy,它不会在 502 上重试,因此当协调器冒泡返回 502 响应代码时,协调器请求不会重试。

我的 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,但是我不确定如何在我的客户端工厂中使用它。

4

1 回答 1

0

您也可以通过更改 RetryPolicy 来更改重试尝试的次数。

public partial class YourAutoGeneratedClient
{
    partial void CustomInitialize()
    {
        var retryPolicy = new RetryPolicy<TransientErrorIgnoreStrategy>(0);
        SetRetryPolicy(retryPolicy);
    }
}
于 2018-01-31T21:02:54.173 回答