HTTP 按需触发 Azure 函数多次调用自身

Posted

技术标签:

【中文标题】HTTP 按需触发 Azure 函数多次调用自身【英文标题】:HTTP Trigger on demand azure function calling itself multiple times 【发布时间】:2020-05-07 02:39:19 【问题描述】:

我添加了 http 触发的 azure 函数并将其部署在函数应用程序中。函数应用程序仅包含一个此 http 按需触发 azure 函数。功能应用有应用服务计划,而不是消费计划。

另外,函数应用版本是 ~1。所以超时是无限的。

在 azure 函数代码中,我正在读取一个包含数千条历史记录的文件并处理这些记录。这项任务需要一个多小时的时间。这是一次任务。

当我在部署后调用此 azure 函数时,它会被调用,一段时间后我注意到它再次被调用并再次处理已处理的记录。

谁能帮我理解一下azure函数的调用策略,如果azure函数长时间运行没有任何状态,它会自己回调吗?

如果是,如何阻止它再次回调,直到它完成处理。

【问题讨论】:

似乎超时是罪魁祸首***.com/questions/50349161/… 那么,如果我将处理转移到异步函数并在没有等待的情况下调用它并发送 HTTP 触发成功响应,这会解决我的问题吗? 您正在使用应用服务计划。但无论函数应用超时设置如何,230 秒都是 HTTP 触发函数响应请求所需的最长时间。这是因为 Azure 负载均衡器的默认空闲超时。对于更长的处理时间,请考虑使用 Durable Functions 异步模式或推迟实际工作并立即返回响应。 【参考方案1】:

函数应该是短暂的,它们不应该运行很长时间。函数的优势在于吞吐量很小或可变的短期执行。

尽可能将大型函数重构为较小的函数集,这些函数集可以协同工作并快速返回响应。例如,webhook 或 HTTP 触发函数可能需要在特定时间限制内的确认响应; webhook 需要立即响应是很常见的。您可以将 HTTP 触发器负载传递到队列中以由队列触发器函数处理。这种方法可以让您推迟实际工作并立即返回响应。

看看这个:

https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#avoid-long-running-functions

使用 Durable Functions,您可以轻松地支持长时间运行的进程,应用 Async HTTP APIs。如果您正在处理需要一些时间来处理有效负载或请求的功能,则在“应用服务计划、WebJob 或持久功能”下运行是正确的方法。

正如@Thiago Custodio 所建议的,您还需要将大文件拆分为较小的文件,并将它们传递给持久函数工作流中的活动。

【讨论】:

很好的答案。只有一点,仅通过切换到持久功能是不够的。我建议您将大文件拆分为较小的文件,并将它们传递给持久函数工作流中的活动。

以上是关于HTTP 按需触发 Azure 函数多次调用自身的主要内容,如果未能解决你的问题,请参考以下文章

Azure 函数 - 防止多次调用

从 Azure Python HTTP 触发函数调用 Azure 逻辑应用

Azure HTTP 触发函数调用返回 417 错误代码

如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应

保护非 Http 触发的 Azure 函数,如服务总线触发器

触发从“Keycloak”到“Azure ADB2C”的基本 http 调用以进行令牌响应时出错