[英]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));
DecorrelatedJitterBackoffV2
medianFirstRetryDelay
参数每 1 小时重试一次
var retryForeverWithAnHourDelay = Policy
.Handle<Exception>()
.WaitAndRetryForeverAsync(_ => TimeSpan.FromHours(1));
我试过政策包装
var combinedRetryPolicy = Policy.WrapAsync(retryForeverWithAnHourDelay, retryWithBackoff);
retryWithBackoff
没有成功,则尝试retryForeverWithAnHourDelay
在这里你可以找到一个简单的 do.net 小提琴应用程序,它在工作中演示了这一点:
尽管和 Polly 睡一个小时是可行的,但不建议这样做。 Polly 的重试主要是为了克服瞬态故障。 这些故障应该会在几分钟内消失/自我修复(而不是几小时或几天)。
如果您需要等待那么久,我宁愿建议使用某种作业调度程序,如Quartz.NET或Hangfire 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.