C#ExponentialBackOff到Timespan Polly

时间:2018-11-01 20:15:41

标签: c# polly retrypolicy

我正在用Polly框架替换当前的重试策略。我曾经这样定义重试策略:

var strategy = new ExponentialBackoff(RetryStrategy.DefaultClientRetryCount, RetryStrategy.DefaultMinBackoff, RetryStrategy.DefaultMaxBackoff, RetryStrategy.DefaultClientBackoff);

其中DefaultClientRetryCount是重试次数 然后exponentialBackoff根据变量计算两次重试之间的睡眠时间:DefaultMinBackoff是两次重试之间的最小时间间隔; DefaultMaxBackoff是最大时间跨度; DefaultClientBackoff是默认值,用于计算重试之间的随机增量。

在Polly上,我这样定义retryPolicy:

var retryPolicy = Policy.Handle<Exception>(ex => _transientErrorDetectionStrategy.IsTransient(ex)).WaitAndRetryAsync(int retryCount, Func<int,timespan> sleepDuration);

其中retryCount是重试次数,而sleepDuration是两次重试之间的时间。

如何在上一个策略生成的重试之间复制时间跨度,以作为参数发送给Polly上的WaitAndRetryAsync方法?

1 个答案:

答案 0 :(得分:0)

具体查看 Polly.Contrib.WaitAndRetry 库... DecorrelatedJitterBackoffV2,其描述如下(根据他们的文档):

<块引用>

以指数退避、抖动的方式产生睡眠持续时间,使 肯定会减轻任何相关性。例如:850ms、1455ms、3060ms。每次讨论 在 Polly 问题 530 中,此实现的抖动表现出较少的尖峰和 比 AWS 抖动公式更平滑的分布。

这个帮助程序将产生您正在寻找的延迟,并且额外的好处是提前解决了所有的问题和错误,这要归功于很棒的 Polly 社区!一旦延迟,您就可以转身并用它来定义您的政策:

var maxDelay = TimeSpan.FromSeconds(45);
var delay = Backoff.DecorrelatedJitterBackoffV2(
    medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 50)
        .Select(s => TimeSpan.FromTicks(Math.Min(s.Ticks, maxDelay.Ticks)));

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

附言此辅助方法还有 2 个其他可选参数:

<块引用>

seed:使用的可选 System.Random 种子。如果未指定,将使用带有随机种子的共享实例,根据 Microsoft 的最大随机性建议。

<块引用>

fastFirst:第一次重试是否立即进行。