首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用polly在.Net内核中进行动态抖动等待和重试

如何使用polly在.Net内核中进行动态抖动等待和重试
EN

Stack Overflow用户
提问于 2022-07-27 04:02:19
回答 1查看 218关注 0票数 1

我正在实现wait和使用抖动重试,见下文。在下面的例子中,延迟是相同的。

怎样才能使延迟变得动态?

代码语言:javascript
复制
var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 3);
var retryPolicy = Policy.Handle<FooException>().WaitAndRetryAsync(delay);

在我的项目中,我有Azure函数https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection

代码语言:javascript
复制
public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        var configuration = builder.GetContext().Configuration;
        builder.Services.RegisterService(configuration);
    }
}
代码语言:javascript
复制
public static IHttpClientBuilder RegisterService(this IServiceCollection serviceCollection,IConfiguration configuration)
{
    return serviceCollection.AddHttpClient<IService, Service()
               .AddPolicyHandler(RetryPolicyHandler.GetRetryPolicy())
}

public static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy(IConfiguration configuration)
{
    var delay =Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 3);
    return HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(delay);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-27 05:28:33

不,延迟是,而不是

DecorrelatedJitterBackoffV2将返回一个IEnumerable<TimeSpan>,因此,请发出以下命令:

代码语言:javascript
复制
var sleepDurations = delay.ToArray();

并使用调试可视化程序来查看它们的不同。如果你多次运行这个实验,延迟总是不同的。

更新#1

我的理解是,RetryPolicy将被调用一次(函数启动),这将设置延迟持续时间。如果我错了,请纠正我

这是个错误的假设。将为每个HttpClient调用创建一个新的重试策略。为了演示下面的两个后续方法调用:

代码语言:javascript
复制
await client.GetAsync("http://httpstat.us/408");
await client.GetAsync("http://httpstat.us/408");

并在onRetry委托中添加一些日志记录。

代码语言:javascript
复制
.WaitAndRetryAsync(Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 3),
    onRetry: (dr, ts) => {
        Console.WriteLine($"Delay: {ts}"); //Replace this with ILogger                     
    })

然后,您将在日志中看到类似的内容:

代码语言:javascript
复制
Delay: 00:00:00.4752054
...
Delay: 00:00:01.2825508
...
Delay: 00:00:03.1409815
...
...
Delay: 00:00:01.2526426
...
Delay: 00:00:01.2919173
...
Delay: 00:00:00.3157069

如您所见,两个GetAsync调用都不使用相同的睡眠时间序列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73132129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档