[英]Using Polly in C#, can I wait until a timespan elapses OR a task terminates before retrying?
[英]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.