繁体   English   中英

Polly C# 以指数方式重试 3 次,然后切换为每小时重试

[英]Polly C# retry exponentially for 3 tries then switch to retrying every hour

我正在尝试使用 polly 构建一个策略,该策略可以按指数方式重试 n 次,然后切换为每 1 小时重试一次。 这可以实现吗?

我尝试了 policy Wrap 但没有得到预期的结果

这应该可以通过接受自定义sleepDurationProvider的重载来实现。 例如像下面这样的东西:

var waitAndRetry = Policy
    .Handle<SomeException>()
    .WaitAndRetry(4, retryAttempt => retryAttempt switch // or WaitAndRetryForever
    {
        <= 3 => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // for example n == 3
        _ => TimeSpan.FromHours(1)
    });

我可能会迟到,但让我分享一下我的想法:

构造一个可以按指数方式重试 n 次的策略这是一个如何构造的示例

var retryWithBackoff = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromSeconds(1), n));
  • 您需要使用Polly.Contrib.WaitAndRetry才能使用DecorrelatedJitterBackoffV2
    • 在这里您可以找到一个很好的解释,这种带有抖动的指数退避是如何工作的
    • 请根据您的需要调整medianFirstRetryDelay参数
  • 还请根据您的需要调整触发器

每 1 小时重试一次

var retryForeverWithAnHourDelay = Policy
    .Handle<Exception>()
    .WaitAndRetryForeverAsync(_ => TimeSpan.FromHours(1));
  • 我一直使用重试,因为根据您的要求,您似乎想要重试直到成功
  • 我已经使用 async 来避免在策略休眠时阻塞一个小时

我试过政策包装

var combinedRetryPolicy = Policy.WrapAsync(retryForeverWithAnHourDelay, retryWithBackoff);
  • 请注意下单
    • 左侧参数是外部策略
    • 右侧参数是内部策略
  • 换句话说,如果retryWithBackoff没有成功,则尝试retryForeverWithAnHourDelay

在这里你可以找到一个简单的 do.net 小提琴应用程序,它在工作中演示了这一点:


最后的想法

尽管和 Polly 睡一个小时是可行的,但不建议这样做。 Polly 的重试主要是为了克服瞬态故障。 这些故障应该会在几分钟内消失/自我修复(而不是几小时或几天)。

如果您需要等待那么久,我宁愿建议使用某种作业调度程序,如Quartz.NETHangfire

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM