Polly重试策略疑问:连接类错误是否重连及重试间隔问题
问题:Polly重试策略相关疑问
我想了解Polly是否会对「连接异常终止」「无法与服务器建立连接」这类错误进行重试。目前我正在使用搭配WinHttpHandler(用于HTTP/2)的HttpClient,我的Polly重试策略如下:
var waitAndRetry = Policy .HandleResult<HttpResponseMessage>(r => HTTPCodesWorthRetrying(r)) .Or<HttpRequestException>() // 注:原代码中`HandleRequestException`应为笔误,推测是`HttpRequestException` .Or<TimeoutRejectionException>() .WaitAndRetryAsync( 3, retryAttempt => ExponentialBackoff(retryAttempt), onRetry => { // some logging } );
我发现当出现带有IOException或WinHttpException作为内部异常的HttpRequestException时,请求会被重试3次但最终仍失败。我的具体疑问是:
- 当遇到「连接异常终止」「无法与服务器建立连接」「服务器返回无效或无法识别的响应」这类错误时,Polly会在重试期间重新建立新连接吗?
- 是否是因为我重试过快,初始重试延迟仅为100ms?我未在Polly文档中找到相关细节。
解答
1. 重试时会重建新连接吗?
会。Polly的重试逻辑是触发全新的HTTP请求执行流程,而非复用之前失败的连接。这类连接相关的错误发生时,原连接已处于不可用状态,HttpClient(搭配WinHttpHandler)会自动处理连接的重建——这是客户端底层的行为,Polly只负责发起重试请求,最终连接的新建/复用由HttpClient的连接池机制决定。
对于「服务器返回无效或无法识别的响应」场景,同样会触发完整的新请求流程:如果连接池中有可用的健康连接,会优先复用;没有的话则新建连接。
2. 初始100ms延迟是否会导致重试失败?
大概率是原因之一。100ms的初始延迟太短,面对服务端临时故障(如过载、重启)或网络波动时,服务端/网络可能还未恢复到可处理请求的状态,连续快速重试只会加剧问题:
- 「无法建立连接」可能是服务端端口耗尽、临时拒绝连接,短间隔重试会让服务端来不及释放资源;
- 「连接异常终止」多与网络波动、服务端重启有关,需要给系统足够的缓冲时间。
建议调整指数退避策略:
- 提高初始延迟到500ms~1秒,同时设置最大重试间隔上限(如10秒),避免延迟过长;
- 加入随机抖动(jitter),防止多个客户端同时重试引发的请求风暴。
示例调整后的退避逻辑:
var random = new Random(); retryAttempt => { // 基础指数延迟:500ms, 1s, 2s... var baseDelay = TimeSpan.FromMilliseconds(500 * Math.Pow(2, retryAttempt - 1)); // 加入0~200ms的随机抖动 var jitter = TimeSpan.FromMilliseconds(random.Next(0, 200)); // 限制最大延迟为10秒 return TimeSpan.FromMilliseconds(Math.Min(10000, baseDelay.TotalMilliseconds + jitter.TotalMilliseconds)); }
内容的提问来源于stack exchange,提问作者Neel Tiwari
相关产品推荐
相关产品推荐

