我正在使用
HTTPClient
和 WinHttpHanlder
(对于 http/2),我的 Polly 重试策略看起来像这样
var waitAndRetry = Policy
.HandleResult<HttpResponseMessage>(r => HTTPCodesWorthRetrying(r))
.Or<HandleRequestException>()
.Or<TimeoutRejectionException>().
WaitAndRetryAsync(
3,
retryAttempt => ExponentialBackoff(retryAttempt),
onRetry => {
//some logging
}
)
我注意到,如果出现
HandleRequestException
(以 IOException
或 WinHttpException
作为内部异常),调用会重试 3 次但仍然失败。
我的问题是:
在重试期间,Polly 是否会在出现“连接异常终止”或“无法与服务器建立连接”等错误或“服务器返回无效或无法识别的响应”等错误时重新连接并建立新连接。
或者我重试太快,初始重试延迟为 100 毫秒?
在 polly 文档中没有找到任何详细信息。
在重试期间,Polly 是否会在出现“连接异常终止”或“无法与服务器建立连接”等错误或“服务器返回无效或无法识别的响应”等错误时重新连接并建立新连接。
Polly 的重试策略(或 V8 情况下的策略)与域无关。这意味着他们没有任何“智能”逻辑,具体取决于他们所装饰的内容。对于数学计算或网络调用执行完全相同的重试逻辑。
对于每次尝试(也包括初始尝试),都会执行完全相同的用户提供的委托/回调。您可以通过更改在策略外部定义的
onRetry
内的变量来稍微修改执行。
var downstreamUrl = "primary-host-address";
var waitAndRetry = Policy
.HandleResult<HttpResponseMessage>(r => HTTPCodesWorthRetrying(r))
WaitAndRetryAsync(..., onRetry => {
string downstreamUrl = "secondary-host-address";
}
);
waitAndRetry.ExecuteAsync(ct => Foo(downstreamUrl, ct), CancellationToken.None);
或者我重试太快,初始重试延迟为 100 毫秒?
很可能是的。如果由于某些短暂的网络故障而出现连接问题,那么它不太可能在这么短的时间内自我修复。使用指数退避是一个很好的做法。 这个贡献定义了一个名为
DecorrelatedJitterBackoffV2
的退避策略,在这种情况下非常方便。