【问题标题】:How to "trick" Azure Function into running longer than 10 minutes如何“欺骗”Azure Function 运行时间超过 10 分钟
【发布时间】:2018-12-22 22:17:28
【问题描述】:

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!");   
}

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

(稍微相关一点,普通的 Azure Web Jobs 过时了吗?我在资源下找不到它。)

【问题讨论】:

  • 当您收到下载文件的请求时,在 blob 存储中创建一个文件并将该链接返回给用户。对你有用吗?

标签: c# azure azure-functions azure-blob-storage


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    根据工作负载的详细信息,另一个选项是利用 Azure 容器实例。您可以让您的 Azure Function 启动一个容器,处理您的工作负载(下载您的文件 \ 进行一些处理等),然后为您关闭您的容器。启动时间通常为几秒钟,您只需为使用的内容付费(无需专门的应用服务计划或 vm 实例)。有关 ACI here 的更多详细信息。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        在触发函数应用的最后一个函数后 10 分钟(基于 host.json 文件中的超时设置),运行函数应用的 VM 将停止。

        为防止发生这种行为,您可以设置一个空的Timertrigger function,每 5 分钟运行一次。它不会花费任何费用,并且可以让您的应用保持正常运行。

        【讨论】:

        • 你能详细说明一下吗?您要发回什么以及设置等?
        【解决方案5】:

        我认为这个问题与冷启动状态有关。在这里您可以找到有关它的更多详细信息。 https://markheath.net/post/avoiding-azure-functions-cold-starts

        你可以做的是,创建一个触发 azure 函数来“ping”你长时间运行的函数以保持它“温暖”

        namespace NewProject
        {
         public static class PingTimer
            {
                [FunctionName("PingTimer")]
                public static async Task Run([TimerTrigger("0 */4 * * * *")]TimerInfo myTimer, TraceWriter log)
                {
                    // This CRON job executes every 4 minutes
        
        log.Info($"PingTimer function executed at: {DateTime.Now}");
        
                    var client = new HttpClient();
                    string url = @"<Azure function URL>";
                    var result = await client.GetAsync(new Uri(url));
        
                    log.Info($"PingTimer function executed completed at: {DateTime.Now}");
                }
            }}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          • 2013-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多