0

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

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

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

在 Polly 上,我这样定义我的 retryPolicy:

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

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

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

4

1 回答 1

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);

PS 这个辅助方法有 2 个其他可选参数:

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

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

于 2021-03-18T15:41:16.630 回答