【问题标题】:How do I handle long running jobs in Azure App Service?如何在 Azure 应用服务中处理长时间运行的作业?
【发布时间】:2019-06-06 14:05:43
【问题描述】:

我对在 Azure 中进行托管比较陌生。我有一个 .net 4.6 Web 应用,在 Azure 中作为应用服务运行。

该解决方案包含一些运行很长时间的操作。这些在 230 秒超时后停止,这似乎是 Azure 的事情。

我了解到我应该将此代码放在 Azure 函数中,以便让它作为后台作业运行。这里应该没有超时,只要我不使用消费计划。

我还在我的解决方案中使用 Azure 存储。

我的问题是,如果我使用 Azure Functions v1 (NuGet Microsoft.NET.Sdk.Functions v1.0.24),我不得不使用 Newtonsoft.Json version =9.0.1 同时 NuGet WindowsAzure.Storage 需要 Newtonsoft.Json 版本 >=10.0.2

这对我来说很糟糕。

然后我试用了 Azure Functions v2。但它只支持 .Net Core,这不是我在这个项目中的一个选项。

我的主要问题仍然是找到一种能够运行这些长时间运行的任务的方法。

一种方法是将工作分解成更小的部分,但在这种情况下,我希望在同一个请求中处理它。

【问题讨论】:

  • 看看 Azure WebJobs。它是 Azure Functions 背后的下划线资源。我相信它支持 .NET Core 以外的其他平台。 Run Background tasks with WebJobs in Azure App Service
  • 确实,但看起来,Web 作业在应用服务上下文中运行,并且也有 230 秒的限制。

标签: azure azure-web-app-service


【解决方案1】:

检查您没有在 hosts.json 中配置超时。

"functionTimeout": "00:05:00"

V1 和 V2 are documented here 的完整配置选项。

在消费计划中,最长超时时间为 10 分钟。在应用服务计划中,它可以是无限期的(但设置一个上限是有意义的,即使它只有 1 或 2 小时)。

如果你想分解你的功能,你可以找到一个合适的Durable Functions pattern。

在你的 Newtonsoft 冲突中,看看你是否可以解决这个using a binding redirect。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-9.9.0.0" newVersion="10.0.2.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

【讨论】:

  • 感谢您的回复!我在考虑尝试bindingRedirects,但是当没有.config文件时,我应该把它放在哪里?
  • 添加配置文件
  • 我找不到将包含大量 .NET 框架工具的后端项目与运行 .NET Core 的 Azure Function 2.0 相结合的好方法。这就像一个又一个问题。所以,我想我必须找到一种方法将其拆分为更小的部分,或者找到一种方法将其作为后台线程运行......
  • 我不知道你的后端项目的编码是做什么的,但是 Azure Functions 应该是独立的,每个都执行一个特定的功能(单一职责)。如果您的函数依赖于后端代码,那么您需要将该代码也移植到 .net Core,或者将代码放在(Web)服务接口后面。
猜你喜欢
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多