繁体   English   中英

C# ExponentialBackOff 到时间跨度 Polly

[英]C# ExponentialBackOff to Timespan Polly

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

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

其中DefaultClientRetryCount是重试次数,然后 indexBackoff 根据变量计算重试之间的休眠时间: 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方法?

查看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:第一次重试是否立即进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM