我正在用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
方法?
答案 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:第一次重试是否立即进行。