Polly-我如何记录最终错误并继续?

问题描述 投票:0回答:1

我正在尝试在.Net Core 3.1(Azure Functions v3)中设置Polly。

我想在Startup类中创建一个Policy,可以将其注入函数中。

我正在寻找的行为是:它应该WaitAndRetryAsync 3次-如果最后一次尝试失败-它应该捕获并记录此异常(Serilog),否则继续。

此刻我有:

        AsyncRetryPolicy emailRetryPolicy = Policy.Handle<Exception>()
            .WaitAndRetryAsync(3, retryAttempt =>
            TimeSpan.FromMilliseconds(retryAttempt * 500));

如您所见,我错过了3次尝试记录错误的部分-然后继续。任何想法如何做到这一点?

Serilog也已添加到Startup类中(显示了部分代码)

builder.Services.AddLogging(al => al.AddSerilog(logger));

我将使用MailKit发送电子邮件,并希望记录由于某种原因而失败的电子邮件。它不应停止程序运行。

serilog polly
1个回答
0
投票

重试策略以下列方式工作:

  • 它试图执行动作
    • 如果失败并由策略处理,它将等待预定的时间,然后再尝试下一次
    • 如果失败并且策略不处理它,则它将返回原始值(可能是例外)
  • 达到最大重试次数后(第一次初次尝试+ n次重试),但仍然失败,然后将以原始值返回

根据要使用此重试策略包装的业务逻辑,您有以下两个选择:

  1. 如果是功能,则可以使用Fallback policy。 (很明显,如果可以提供回退值。)在回退中,您将进行日志记录,然后返回回退值。您可以将这两个策略与Policy.Wrap链接在一起,但要注意顺序。

样本后备策略:

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);
  1. 如果是一种方法,则可以使用onRetryAsyncAsyncRetryPolicy回调

示例重试策略:

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 ...");
    );
© www.soinside.com 2019 - 2024. All rights reserved.