New options to control retry logic for transient failures (#4750)

* Add an option to control the number of automatic retries for transient failures.

* Add SleepDurationProvider option for ElsaClientBuilderOptions

---------

Co-authored-by: admin <admin@admin.com>
This commit is contained in:
Night Wu 2024-01-06 09:42:36 +00:00 committed by GitHub
parent 480b726c9d
commit 99dca9b1ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 1 deletions

View file

@ -90,7 +90,13 @@ public static class DependencyInjectionExtensions
{
var builder = services.AddRefitClient<T>(CreateRefitSettings, typeof(T).Name).ConfigureHttpClient(ConfigureElsaApiHttpClient);
httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder);
builder.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));
var retryCount = httpClientBuilderOptions?.TransientHttpErrorRetryCount ?? 0;
var sleepDurationProvider = httpClientBuilderOptions?.SleepDurationProvider ?? (retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
if (retryCount > 0)
{
builder.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(retryCount, sleepDurationProvider));
}
}
/// <summary>

View file

@ -33,4 +33,23 @@ public class ElsaClientBuilderOptions
/// Gets or sets a delegate that can be used to configure the HTTP client builder.
/// </summary>
public Action<IHttpClientBuilder> ConfigureHttpClientBuilder { get; set; } = _ => { };
/// <summary>
/// Number of automatic retries for transient failures, including following categories:
/// <list type = "bullet" >
/// <item><description> Network failures(as <see cref = "HttpRequestException" />)</description></item>
/// <item><description>HTTP 5XX status codes(server errors)</description></item>
/// <item><description>HTTP 408 status code(request timeout)</description></item>
/// </list>
/// Default value is 3.
/// Set the value to 0 to disable automatic retry.
/// </summary>
public int TransientHttpErrorRetryCount { get; set; } = 3;
/// <summary>
/// The function that provides the duration to wait for for each transient failure retry attempt.
/// This option is useless if TransientHttpErrorRetryCount is set to 0.
/// Default strategy is exponential backoff: TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)).
/// </summary>
public Func<int, TimeSpan> SleepDurationProvider = retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt));
}