【问题标题】:AutoRest custom retry policy with status code transform带有状态码转换的 AutoRest 自定义重试策略
【发布时间】:2018-07-03 18:13:23
【问题描述】:

我正在开发一个包含一些微服务和一个通过 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,但是我不确定如何在我的客户端工厂中使用它。

【问题讨论】:

    标签: c# rest autorest


    【解决方案1】:

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

    public partial class YourAutoGeneratedClient
    {
        partial void CustomInitialize()
        {
            var retryPolicy = new RetryPolicy<TransientErrorIgnoreStrategy>(0);
            SetRetryPolicy(retryPolicy);
        }
    }
    

    【讨论】:

    • 我仍然想重试 500 及以上的错误代码,这就是我想要自定义策略的原因。
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2020-05-27
    • 2018-08-02
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多