耐用功能超时

Shr*_*r S 2 timeoutexception long-running-processes azure-durable-functions

我正在使用 Azure Durable Functions .Net Core。

[FunctionName("Calculate")]
public async Task RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
    await context.CallActivityAsync<object>(FuncConstants.Cal1, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal2, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal3, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal4, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal5, null);   
    await context.CallActivityAsync<object>(FuncConstants.Cal6, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal7, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal8, null);
    await context.CallActivityAsync<object>(FuncConstants.Cal9, null);
}

[FunctionName("Starter_Calculation")]
public static async Task<HttpResponseMessage> HttpStart(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    [DurableClient] IDurableOrchestrationClient starter,
    ILogger log)
{
    string instanceId = await starter.StartNewAsync("Calculate", null);
    return starter.CreateCheckStatusResponse(req, instanceId);
}
Run Code Online (Sandbox Code Playgroud)

这里,每个函数需要超过 5-6 个小时来执行一些逻辑计算(算术运算),因为它们处理超过 27-3000 万条数据库记录。

我收到第一个函数本身的错误为 "Timeout value of 00:30:00 was exceeded by function。在Azure中,我正在使用Premium App Service Plan,所以我可以设置AlwaysOn

我有一些问题:

  1. Azure Function 是否最适合这种场景/长时间运行的操作?
  2. 如果是,有什么方法可以在本地测试它而不会出现超时错误?

请指教。

Ada*_*Dev 5

如果您使用的是高级或专用(应用服务)计划,则某个功能的默认超时为 30 分钟 - 这就是您所遇到的情况。

您可以通过functionTimeout在 host.json 中配置来扩展它。

对于这两个计划中的任何一个,技术上都没有最大超时。尽管对于 Premium,执行只能保证 60 分钟。

请参阅文档:https ://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json#functiontimeout

有两种主要策略可以避免持久函数超时:

  1. 通过 host.json 增加超时
  2. 将工作分解为更小的单元,并调用更多的活动函数

第二个策略很有价值 - 较小的工作单元可以在发生暂时性故障时为您提供更好的恢复/恢复体验。另外,您可以并行活动函数调用以减少总体处理时间。

要并行运行多个活动函数,您可以await Task.WhenAll多个活动调用 - 请查看此处文档中扇出-扇入模式中的示例:https://learn.microsoft.com/en-us/azure/azure-functions /durable/durable-functions-cloud-backup?tabs=csharp#e2_backupsitecontent-orchestrator-function

从您的示例中尚不清楚您的活动函数是否需要等待前一个活动函数完成(即必须串行链接在一起),或者它们是否完全独立,因此可以并行完成。但是,Durable Functions 的强大之处在于支持各种模式并为您处理许多底层协调。