PSX*_*XYU 5 c# app-startup serilog polly retry-logic
我正在尝试在 .Net Core 3.1 (Azure Functions v3) 中设置 Polly。
我想在 Startup 类中创建一个策略,我可以将其注入到函数中。
我正在寻找的行为是:它应该等待并重试 3 次 - 如果最后一次尝试失败 - 它应该捕获并记录异常(Serilog),否则继续。
目前我有以下代码:
AsyncRetryPolicy emailRetryPolicy = Policy.Handle<Exception>()
.WaitAndRetryAsync(3, retryAttempt =>
TimeSpan.FromMilliseconds(retryAttempt * 500));
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我错过了 3 次尝试后记录错误的部分 - 然后继续。知道如何做到这一点吗?
Serilog 也添加到 Startup 类中(显示部分代码)
builder.Services.AddLogging(al => al.AddSerilog(logger));
Run Code Online (Sandbox Code Playgroud)
我将使用MailKit发送一封电子邮件,并希望在由于某些原因失败时进行记录。它不应该停止程序的运行。
重试策略的工作原理如下:
根据您希望使用此重试策略包装的业务逻辑,您有以下两个选项:
Policy.WrapAsync,但要注意它们的顺序。后备策略示例:
var fallbackPolicy = Policy<YourResponse>
.Handle<Exception>()
.FallbackAsync( (ct) =>
{
logger.LogError("Operation has been failed after several retries ...");
return Task.FromResult(new YourResponse { ... });
});
var combinedPolicy = Policy.WrapAsync(fallbackPolicy, retryPolicy);
Run Code Online (Sandbox Code Playgroud)
onRetryAsync的回调AsyncRetryPolicy重试策略示例:
var retryPolicy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(
settings.RetryCount,
_ => TimeSpan.FromMilliseconds(settings.SleepDurationInMilliseconds),
onRetryAsync: (ex, count, context) =>
logger.LogError("Operation has been failed after several retries ...");
);
Run Code Online (Sandbox Code Playgroud)
我想强调的是,重试策略是为幂等操作而设计的。任何可能会发送电子邮件作为副作用的服务调用都不是幂等操作。