使用消费计划中的Azure功能应用程序,我有两个计时器触发的C#函数,大约需要1分钟才能运行。
如果他们在不同时间运行,他们每个人都会成功运行。但是,如果我在时间上重叠它们,那么函数永远不会完成并且它们会达到超时。
我无法看到并发问题可能来自哪里。这些函数通过EF从Azure SQL读取数据,并将结果写入Azure存储上的不同blob。
这两个函数之前在Azure应用服务中托管的ASP.NET MVC Web应用程序(Web App)中实现了webjobs并且同时正确运行。
当我将两个webjobs移动到Azure Functions App时,我将Web App bin文件夹的内容复制到Function App bin文件夹中,然后在每个函数中引用必要的dll。
我能想到这个并发问题的一个原因是复制Web App bin文件夹的内容。
我能想到的另一个原因是,消费计划是不是预算每个新功能的内存,从而正确缩放。例如,如果触发的新函数本身需要大量内存,则可能应该将其分配给新的计算实例,而不是共享先前的计算实例。因为我的函数占用了大量内存,如果第一个函数被分配给一个小型计算实例而第二个函数被分配给同一个小型计算实例,则两者都可能超过限制而导致超时。
修改
根据Matt Mason MSFT的建议获得其他结果。
但是,在单独的应用程序中运行这些功能并不是一种可接受的解决方案。
答案 0 :(得分:1)
尝试使用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提出问题,要求在实例间更好地分发重量级计时器功能 - 但是,最好的办法是使用单独的应用程序或添加租约管理/安排以确保您的功能不会同时运行。