对于消费计划中的Azure函数应用程序,我有两个定时器触发的C#函数,大约需要1分钟才能运行。Azure函数并发超时
如果他们在不同的时间运行,他们每个人都能成功运行。但是,如果我在时间上重叠运行它们,那么这些功能将永远无法完成,并且会超时。
我看不到并发问题可能来自哪里。这些函数通过EF从Azure SQL读取数据并将结果写入Azure存储上的不同Blob。
这两个函数在ASP.NET MVC Web应用程序(Web应用程序)中承载Azure应用程序服务并同时正确运行的webjobs之前实现。
当我将两个webjob移动到Azure函数应用程序时,我将Web App bin文件夹的内容复制到Function App bin文件夹中,然后在每个函数中引用必要的dll。
我认为这个并发问题的一个原因是复制Web App bin文件夹的内容。
我能想到的另一个原因是,如果消费计划没有对每个新功能的内存进行预算,从而正确缩放。例如,如果触发的新功能本身需要大量内存,则可能应将其分配给新的计算实例,而不是共享先前的计算实例。因为我的函数占用大量内存,所以如果第一个函数被分配给一个小的计算实例,并且第二个函数被分配给同一个小计算实例,则两者都可能超过导致超时的限制。
编辑
从Matt Mason MSFT的建议之后的其他结果。
- 使用第二个功能应用程序。也在消费模式下,并在bin文件夹中具有相同的 文件。我能够在不同的功能应用上以相同的 时间运行这两个功能,并且他们成功完成。这 让我相信问题应该来自功能应用程序和 而不是Azure SQL或Blob存储依赖项。
但是,在单独的应用程序中运行功能不是一个可接受的解决方案。从相同功能的应用程序同时运行的功能和 监控实况度量流
结果:
一个。每个函数都单独成功运行,并显示CPU总数为70%至97%,内存为400至700 MB。见第一张图片。
b。两个功能在同一时间。我看到110%的CPU和800 MB的内存,然后指标流空白,我看到了。 “无在线服务器”。一段时间后,我再次看到一台服务器在线,但两种功能状态是“从未完成”。这是功能应用程序崩溃吗?请参阅下面的图像2,3和4。
您是否使用EF的共享(静态)Db连接实例?运行在同一个底层主机上的函数共享一个AppDomain,这可能会导致一些怪异。 –
每个函数都将投射自己的EF的DbContext实例。作为额外的结果。我可以在单独的功能应用上同时运行这两个功能(请参阅上面的编辑)。 – donquijote