Saltar al contenido principal

Política de Reintentos

La política de reintentos re-ejecuta automáticamente una operación fallida hasta un número configurado de veces.

Uso Básico

var policy = ResiliencePolicy.Create()
.Retry(3) // reintentar hasta 3 veces
.Build();

Opciones de Configuración

var policy = ResiliencePolicy.Create()
.Retry(opts =>
{
opts.MaxRetries = 3;
opts.BackoffType = BackoffType.Exponential; // Constant, Linear, Exponential
opts.DelayMs = 200; // retardo base en ms
opts.OnRetry = context =>
{
Console.WriteLine($"Reintento #{context.AttemptNumber}: {context.Exception?.Message}");
return Task.CompletedTask;
};
})
.Build();

Tipos de Backoff

BackoffTypeFórmula de RetardoEjemplo (DelayMs=200)
ConstantDelayMs siempre200ms, 200ms, 200ms
LinearDelayMs × intento200ms, 400ms, 600ms
ExponentialDelayMs × 2^intento + jitter~200ms, ~400ms, ~800ms

Reintentar en Excepciones Específicas

var policy = ResiliencePolicy.Create()
.Retry(opts =>
{
opts.MaxRetries = 3;
// Solo reintentar en estos tipos de excepción
opts.RetryOnExceptions = new[]
{
typeof(HttpRequestException),
typeof(TimeoutException)
};
})
.Build();

Reintentar en Tipos de Error de Result

var policy = ResiliencePolicy.Create()
.Retry(opts =>
{
opts.MaxRetries = 2;
// Reintentar si el Result falla con estos tipos de error
opts.RetryOnErrorTypes = new[] { ErrorType.Failure };
})
.Build();

Callback OnRetry

.Retry(opts =>
{
opts.MaxRetries = 3;
opts.OnRetry = context =>
{
_logger.LogWarning(
"Intento de reintento {Attempt}/{Max}: {Error}",
context.AttemptNumber,
context.MaxAttempts,
context.Exception?.Message ?? context.Result?.ToString());
return Task.CompletedTask;
};
})