我正在尝试使用 Polly 构建一个策略,可以指数级地重试 n 次,然后切换到每小时重试一次。这个能实现吗?
我尝试了 Policy Wrap,但没有得到期望的结果。
我正在尝试使用 Polly 构建一个策略,可以指数级地重试 n 次,然后切换到每小时重试一次。这个能实现吗?
我尝试了 Policy Wrap,但没有得到期望的结果。
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)
});
var retryWithBackoff = Policy
.Handle<Exception>()
.WaitAndRetryAsync(Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromSeconds(1), n));
DecorrelatedJitterBackoffV2
。medianFirstRetryDelay
参数。每隔1小时重试一次。
var retryForeverWithAnHourDelay = Policy
.Handle<Exception>()
.WaitAndRetryForeverAsync(_ => TimeSpan.FromHours(1));
我尝试了策略包装(policy Wrap)。
var combinedRetryPolicy = Policy.WrapAsync(retryForeverWithAnHourDelay, retryWithBackoff);
retryWithBackoff
失败,则尝试retryForeverWithAnHourDelay
。
虽然可以和 Polly 一起睡一个小时,但并不建议这样做。Polly 的重试主要是为了克服短暂的故障。这些故障应该在几分钟内消失/自我修复(而不是在几个小时或几天内)。
如果您需要等待那么长时间,我建议使用某种作业调度程序,如 Quartz.NET 或 Hangfire。