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