【问题标题】:How to set Infinite Timeout for Azure Function app v2.0如何为 Azure Function app v2.0 设置无限超时
【发布时间】:2018-10-23 16:44:57
【问题描述】:

我有一个运行时间很长的进程,它使用面向 v2.0 的 Azure Function App(尽管不建议长时间运行的进程)托管。早些时候它针对 v1.0 运行时,所以我没有遇到任何函数超时问题。

但现在在将运行时更新为目标 v2.0 后,我无法找到任何方法将函数超时设置为无限,就像 v1.0 的情况一样。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你为什么有这么长时间运行的应用程序?也许您可以找到一种方法将其分解为较小的执行和多个 Azure Functions
  • 目前尚无法将其分解。这是一个持续运行的过程,是的,功能应用程序可能不是此过程的理想选择。但我目前无法更改它。所以我必须忍受我现在所拥有的。它与 v1.0 运行时完美配合。我正在寻找 v2.0 运行时的替代方案。

标签: azure timeout azure-functions


【解决方案1】:

从您的 cmets 看来,您目前不适合拆分成更小的函数或使用函数以外的东西。在这种情况下,只要您准备好使用“应用服务计划”,AFAIK 您仍然可以使用 v2.0 进行操作。

10分钟的最大限制仅适用于“消费计划”。

事实上,文档明确表明,如果您有连续或几乎连续运行的功能,那么应用服务计划也可能更具成本效益。

您可以使用“始终开启”设置。在此处的 Microsoft Docs 上阅读它。

Azure Functions scale and hosting

此外,文档明确指出应用服务计划超时的默认值为 30 分钟,但可以手动将其设置为无限制。

Changes in features and functionality

更新

根据我们在 cmets 中的讨论,由于 null 值无法像在 1.x 版本中那样为您工作,请尝试完全取消“functionTimeout”设置。

我遇到了 2 个不同的 SO 帖子,其中提到了类似的内容,并且 Microsoft 文档文本也说没有真正的限制。以下是我遇到的 SO 帖子的链接:

【讨论】:

  • 我在应用服务计划(标准层)上运行我的 Azure 功能,并且还启用了 Always On。但是在运行几个小时后,该函数变得空闲,然后发生函数超时。我尝试将 functionTimeout 设置为 null,就像在以前的 v1.0 中一样,但这也没有帮助。
  • @shyam_baidya 我已经编辑了我的答案以包含链接,该链接明确指出对于 v2.0,默认值为 30 分钟,并且“您可以使用 functionTimeout 设置手动将超时更改回无限制在 host.json 中”。我知道“null”可能不适用于 v2.0,请同时尝试将其设置为一个非常高的数字作为解决方法。我还将尝试在 v2.0 中找到将其指向无限的值(如果不是 null)。
  • @shyam_baidya 请尝试从 host.json 文件中完全删除“function-timeout”属性。我遇到了 2 个不同的 SO 帖子,其中提到了类似的内容,Microsoft 文档文本也说没有真正的限制,所以值得一试。这是我遇到的 SO 帖子的链接:stackoverflow.com/questions/41680125/… 和另一个在这里.. stackoverflow.com/questions/45335646/…
  • 感谢 Rohit 分享这些 SO 链接。我找到了下面的 github 存储库,我的理解是我们不能将 functionTimeout 设置为无限。应用服务计划默认为 30 分钟,否则该值将从 host.json 文件中设置。 github.com/Azure/azure-functions-host/blob/…
  • @shyam_baidya 好的,这是有道理的。在这种情况下,像前面讨论的那样使用非常高的价值将是解决方法。
【解决方案2】:

一种方法是实现Eternal orchestrations from Durable Functions。它允许您实现具有动态间隔的无限循环。当然,您需要随时通过添加对停止/启动功能的支持来稍微修改您的代码(您必须在调用之间传递状态)。

[FunctionName("Long_Running_Process")]
public static async Task Run(
    [OrchestrationTrigger] DurableOrchestrationContext context)
{
    var initialState = context.GetInput<object>();
    var state = await context.CallActivityAsync("Run_Long_Running_Process", initialState);

    if (state == ???) // stop execution when long running process is completed
    {
        return;
    }

    context.ContinueAsNew(state);
}

【讨论】:

    【解决方案3】:

    您不能将 Azure Function App 超时设置为无限。我相信任何 azure 函数应用程序将持续运行的最长时间是 10 分钟。正如您所说,Azure 函数不适用于长时间运行的进程。您可能需要为您的应用找到新的解决方案,尤其是在您将来需要扩展应用的情况下。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多