在 Azure Functions 编排中主动 activity 重试

Unsolicited activity retry in Azure Functions orchestration

我有一个很长的 运行ning(几分钟)工作,其中包含作为 Azure Functions 编排实现的 HTTP 触发器:

[FunctionName("ManualImportOrders")]
public async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Function, "POST")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    var dtoInResult = await ReadDtoInAsync(req);
    if (!dtoInResult.IsSuccess)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent(dtoInResult.Error) };
    }

    string instanceId = await starter.StartNewAsync("ManualImportOrders_Orchestrator", dtoInResult.Value);

    log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

    return starter.CreateCheckStatusResponse(req, instanceId);
}

[FunctionName("ManualImportOrders_Orchestrator")]
public async Task<object> RunOrchestrator([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();

    var result = await context.CallActivityAsync<object>("ManualImportOrders_RunJob", dtoIn);

    return result;
}

[FunctionName("ManualImportOrders_RunJob")]
public async Task<object> RunManualAsync([ActivityTrigger] IDurableActivityContext context, ILogger logger, CancellationToken cancellationToken)
{
    var dtoIn = context.GetInput<ManualImportOrdersDtoIn>();
    logger.LogInformation("Invoking manual order import");
    var result = ... call to business logic ...
    logger.LogInformation("Manual order import completed");
    return result.Output;
}

以上三个函数:

ManualImportOrders_RunJob activity 函数因未处理的异常而失败时,我预计整个编排都会失败。当 运行 确实在本地使用 AF 工具时,就会发生这种情况。但是当 运行 在 Azure 中时,似乎有一些重试机制,因为 activity 函数再次 运行 具有相同的实例 ID。

比如第一个绿运行成功了。在第二个红色 运行 中,activity 函数失败并被反复召回:

知道为什么会这样吗?

我想找durable function有没有默认的重试机制,没找到,我也很迷茫这种现象

但我认为您可以指定一个自动重试策略,这可能会减少对 activity 函数的调用次数。设置重试策略的语法是这样的:

[FunctionName("TimerOrchestratorWithRetry")]
public static async Task Run([OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var retryOptions = new RetryOptions(
        firstRetryInterval: TimeSpan.FromSeconds(5),
        maxNumberOfAttempts: 3);

    await context.CallActivityWithRetryAsync("FlakyFunction", retryOptions, null);

    
}

您可以将maxNumberOfAttempts的值设为最小值。希望对您有所帮助。

更多详情可以参考这位官方document.