C# Academy · 课时

重试策略

使用退避机制重试暂时性故障。

第 1 / 4 课13 个步骤

重试策略 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。

什么是 Polly

Polly 是一个 .NET 弹性库,可帮助您的应用应对瞬时故障、响应缓慢和依赖项过载等情况。它提供重试、熔断器、超时、回退和限流等策略。

本课程使用 Polly v8(即 Polly.Core API)。

dotnet add package Polly.Core

为什么要重试

许多故障都是瞬时的:短暂的网络波动、片刻的超时,或服务正在重启。稍后片刻重试操作通常就能成功,而不会打扰用户。

重试只应针对瞬时错误,绝不能针对 404 之类的永久性错误。

基本重试策略

在 Polly v8 中,您可以使用 ResiliencePipeline 和 RetryStrategyOptions 构建弹性管道。默认情况下,抛出的异常会触发重试。

using Polly;
using Polly.Retry;

var pipeline = new ResiliencePipelineBuilder()
    .AddRetry(new RetryStrategyOptions
    {
        MaxRetryAttempts = 3
    })
    .Build();

通过管道执行

使用 ExecuteAsync 包装存在风险的调用。Polly 会执行该调用;如果调用抛出异常,就会按照配置的次数进行重试。

await pipeline.ExecuteAsync(async token =>
{
    await httpClient.GetAsync("https://api.example.com/data", token);
});

决定重试哪些内容

使用 ShouldHandle 配合谓词构建器,只针对特定异常或结果进行重试,避免对永久性错误重试。

new RetryStrategyOptions<HttpResponseMessage>
{
    ShouldHandle = new PredicateBuilder<HttpResponseMessage>()
        .Handle<HttpRequestException>()
        .HandleResult(r => r.StatusCode == HttpStatusCode.ServiceUnavailable),
    MaxRetryAttempts = 3
};

固定退避与指数退避

立即重试可能会加剧服务的压力。退避会拉开各次尝试之间的间隔。Polly 通过 BackoffType 设置支持固定、线性和指数退避。

指数退避

指数退避会让每次尝试的延迟时间翻倍(例如 2 秒、4 秒、8 秒)。将 BackoffType.Exponential 与基础 Delay 配合使用即可。

new RetryStrategyOptions
{
    MaxRetryAttempts = 4,
    BackoffType = DelayBackoffType.Exponential,
    Delay = TimeSpan.FromSeconds(2)
};

添加抖动

如果许多客户端按照相同的时间表重试,就会产生同步的流量峰值(“惊群效应”)。抖动会为延迟添加随机性。启用 UseJitter = true 即可。

new RetryStrategyOptions
{
    MaxRetryAttempts = 4,
    BackoffType = DelayBackoffType.Exponential,
    Delay = TimeSpan.FromSeconds(1),
    UseJitter = true
};

响应每次重试

OnRetry 回调可让您记录尝试次数或发出指标。它会接收尝试编号以及触发本次重试的故障。

new RetryStrategyOptions
{
    MaxRetryAttempts = 3,
    OnRetry = args =>
    {
        Console.WriteLine($"Retry {args.AttemptNumber} after {args.RetryDelay}");
        return default;
    }
};

限制总重试时间

无界重试可能会让用户等待过久。请将重试与超时策略(稍后介绍)结合使用,或限制尝试次数,以便在恢复可能性不大时让操作快速失败。

HttpClient 的重试

对于 HTTP 调用,请在 HttpClient 上注册弹性处理程序,这样重试就会自动应用于每个请求。

builder.Services.AddHttpClient("api")
    .AddResilienceHandler("retry", pipeline =>
    {
        pipeline.AddRetry(new HttpRetryStrategyOptions
        {
            MaxRetryAttempts = 3,
            BackoffType = DelayBackoffType.Exponential
        });
    });

快速检查

测试您对重试的了解。

回顾

重试策略通过再次尝试操作来处理瞬时故障。在 Polly v8 中,您可以使用 AddRetry 构建管道,使用 ShouldHandle 限定处理范围,并结合 BackoffType.Exponential 和 UseJitter 拉开各次尝试的间隔。使用 OnRetry 观察尝试过程,并注册弹性处理程序来保护每次 HttpClient 调用。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「重试策略」课时是免费的吗?

是的 — 「重试策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。

「重试策略」这节课中我会学到什么?

使用退避机制重试暂时性故障。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「重试策略」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 重试策略
  2. 断路器模式
  3. 超时与备用策略
  4. 弹性管道
← 返回 C# Academy