Azure 函数上的 FixedDelayRetry 属性无法正常工作

问题描述

自从最新的 Microsoft.Azure.WebJobs 程序集发布以来,现在可以通过 [FixedDelayRetry]属性设置 Azure 函数的重试策略。我对这个功能很感兴趣,因为我有一个 Blob 触发函数,它在失败时认重试五次,而我对重试策略功能不感兴趣。我希望函数在失败时不要重试,或者只重试一次。

所以我在我的函数中设置了这个属性,你可以在下面看到,如果函数失败,我已经指示了最大重试次数

public class Function1
{
    private readonly IGremlinService _gremlinService;
    private readonly TelemetryClient _telemetryClient;

    public Function1(IGremlinService gremlinService,TelemetryConfiguration telemetryConfiguration)
    {
        this._gremlinService = gremlinService;
        this._telemetryClient = new TelemetryClient(telemetryConfiguration);
    }

    [FunctionName(nameof(Function1))]
    [FixedDelayRetry(1,"00:00:10")]
    public async Task Run([BlobTrigger("files/{directory}/{name}.pdf",Connection = "AzureWebJobsstorage")] Stream myBlob,string name,ILogger logger)
    {
        try
        {
            //my lengthy code not related to the issue
        }
    }
    }   

当我在我的测试环境中使用 Storage Emulator 和 CosmosDb Emulator 尝试此代码时,它运行得非常好,该函数仅在遇到异常时重试一次。

但是,当我在 Azure 平台上运行我的函数时,它不是在失败时只重试一次,而是重试......九次。我将最大重试次数设置为 5,这一次,该函数重试了 25 次。我的感觉是,该函数不会重试属性中指定的次数,而是将该数字乘以认重试策略 5。您可以在下面看到我的日志,其中该函数显然重试了 10 次:

enter image description here

我做错了什么?

解决方法

函数应用重试策略独立于触发器提供的任何重试或弹性。函数重试策略只会在触发弹性重试之上。您可以在 here 中阅读有关重试行为的信息。

由于 Azure Blob 的 maxDequeueCount 设置为 5(读取 here) 这就是为什么您看到您的消息被多次重试的原因。

要获得所需的结果,您可以将 host.json 中的 maxDequeueCount 属性定义为 1。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...