Azure Functions 并发超时

Azure Functions Concurrency Timeout

使用消费计划中的 Azure Functions 应用程序,我有两个计时器触发的 C# 函数,这些函数大约需要 1 分钟 运行。

他们每个人 运行 如果他们 运行 在不同的时间成功。但是,如果我 运行 它们在时间上重叠,那么函数永远不会完成并且它们会超时。

我看不出并发问题可能来自哪里。这些函数通过 EF 从 Azure SQL 读取数据并将结果写入 Azure 存储上的不同 blob。

这两个函数之前作为 webjobs 在托管在 Azure 应用服务中的 ASP.NET MVC 网络应用程序(Web 应用程序)中实现,并且 运行 同时正确运行。

当我将两个 webjobs 移动到 Azure Functions App 时,我直接将 Web App bin 文件夹的内容复制到 Function App bin 文件夹中,然后在每个函数中引用必要的 dll。

我认为这个并发问题的一个原因是复制 Web App bin 文件夹的内容。

我能想到的另一个原因是,消费计划是否没有为每个新功能预算内存,因此无法正确缩放。例如,如果触发的新功能本身需要大量内存,则可能应该分配给新的计算实例而不是共享以前的计算实例。因为我的函数占用大量内存,所以如果第一个函数分配给一个小型计算实例,第二个函数分配给同一个小型计算实例,则两者都可能超过限制导致超时。

编辑

根据 Matt Mason MSFT 的建议获得的其他结果。

然而,运行将功能集中在单独的应用程序中并不是一个可接受的解决方案。

尝试使用 App Insights 分析您的函数:

https://github.com/Azure/Azure-Functions/wiki/App-Insights-(Preview)

您应该能够看到每个实例的性能计数器(有多少内存使用等)、聚合执行指标和执行日志。

如果函数绝对不能 运行 在一起,请尝试将它们放在单独的函数应用程序中,这样它们就不会 运行 在同一个实例上。


更新: 这可能是功能应用程序崩溃。也可能是 CPU 太高影响了 App Insights 数据上传 - 检查服务器 ID 是否已更改。

您可以在函数中使用 ILogger 参数绑定并记录进度更新,以在应用洞察分析中查看一些执行跟踪。

不幸的是,缩放在这些情况下效果不佳,我建议您在 https://github.com/azure/azure-webjobs-sdk-script/issues 提出问题,要求更好地跨实例分配重量级计时器功能 - 但是,最好的选择是使用单独的应用程序或添加租约 management/scheduling 以确保您的功能不会同时 运行。