如何“欺骗” Azure Function 使其运行时间超过 10 分钟

use*_*000 6 c# azure azure-blob-storage azure-functions

Azure Functions 的时间限制为 10 分钟。假设我有一个长时间运行的任务,例如下载一个需要 1 小时才能下载的文件。

[FunctionName("PerformDownload")]
[return: Queue("download-path-queue")]
public static async Task<string> RunAsync([QueueTrigger("download-url-queue")] string url, TraceWriter log)
{
   string downloadPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString);
   log.Info($"Downloading file at url {url} to {downloadPath} ...");
   using (var client = new WebClient())
   {
       await client.DownloadFileAsync(new Uri(url), myLocalFilePath);
   }
   log.Info("Finished!");   
}
Run Code Online (Sandbox Code Playgroud)

有没有什么hacky的方法可以让这样的事情开始,然后在时间限制到期之前恢复另一个功能?或者有没有更好的方法可以将这样的长任务集成到使用 Azure Functions 的工作流中?

(在一个稍微相关的说明中,普通的 Azure Web 作业是否已过时?我在资源下找不到它。)

Kat*_*izu 7

为可能遇到这篇文章的其他人添加:可以使用Durable Functions扩展在代码中创建由多个 Azure Functions 组成的工作流,该扩展可用于创建调度异步任务、关闭和在所述异步工作时重新唤醒的编排函数已完成。

它们不是需要打开 TCP 端口的长时间运行任务的直接解决方案,例如下载文件(为此,在应用服务计划上运行的函数没有执行时间限制),但它可用于将此类任务集成到更大的工作流程中。


Dav*_*oft 5

有没有什么hacky的方法可以让这样的事情开始,然后在时间限制到期之前恢复另一个功能?

如果您在使用消耗计划,则无法控制 Function App 运行的时间,因此使用在您的 Function 入口点完成后继续运行的后台线程是不可靠的。

在应用服务计划中,你在付费的 VM 上运行,因此你可以将函数应用配置为连续运行。此外,AFAIK 您不必在应用服务计划上设置函数超时,因此您的主函数入口点可以根据需要运行。

或者有没有更好的方法可以将这样的长任务集成到使用 Azure Functions 的工作流中?

是的。使用Azure 数据工厂将数据复制到 Blob 存储中,然后对其进行处理。数据工厂管道可以在复制活动之前和之后调用函数。