You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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次但最终仍失败。我的具体疑问是:

  1. 当遇到「连接异常终止」「无法与服务器建立连接」「服务器返回无效或无法识别的响应」这类错误时,Polly会在重试期间重新建立新连接吗?
  2. 是否是因为我重试过快,初始重试延迟仅为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:14:55