我正在实现wait和使用抖动重试,见下文。在下面的例子中,延迟是相同的。
怎样才能使延迟变得动态?
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
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
var configuration = builder.GetContext().Configuration;
builder.Services.RegisterService(configuration);
}
}
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);
}
发布于 2022-07-27 05:28:33
不,延迟是,而不是。
DecorrelatedJitterBackoffV2
将返回一个IEnumerable<TimeSpan>
,因此,请发出以下命令:
var sleepDurations = delay.ToArray();
并使用调试可视化程序来查看它们的不同。如果你多次运行这个实验,延迟总是不同的。
更新#1
我的理解是,RetryPolicy将被调用一次(函数启动),这将设置延迟持续时间。如果我错了,请纠正我
这是个错误的假设。将为每个HttpClient
调用创建一个新的重试策略。为了演示下面的两个后续方法调用:
await client.GetAsync("http://httpstat.us/408");
await client.GetAsync("http://httpstat.us/408");
并在onRetry
委托中添加一些日志记录。
.WaitAndRetryAsync(Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 3),
onRetry: (dr, ts) => {
Console.WriteLine($"Delay: {ts}"); //Replace this with ILogger
})
然后,您将在日志中看到类似的内容:
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
调用都不使用相同的睡眠时间序列。
https://stackoverflow.com/questions/73132129
复制相似问题