Polly 是否会重试“连接异常终止”或“无法与服务器建立连接”等错误

问题描述 投票:0回答:1

我正在使用

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 次但仍然失败。

我的问题是:

  1. 在重试期间,Polly 是否会在出现“连接异常终止”或“无法与服务器建立连接”等错误或“服务器返回无效或无法识别的响应”等错误时重新连接并建立新连接。

  2. 或者我重试太快,初始重试延迟为 100 毫秒?

在 polly 文档中没有找到任何详细信息。

c# dotnet-httpclient polly retry-logic
1个回答
0
投票

在重试期间,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
的退避策略,在这种情况下非常方便。

© www.soinside.com 2019 - 2024. All rights reserved.