【发布时间】:2017-10-26 01:58:47
【问题描述】:
使用消费计划中的 Azure Functions 应用程序,我有两个计时器触发的 C# 函数,大约需要 1 分钟才能运行。
如果他们在不同的时间运行,他们每个人都会成功运行。但是,如果我在时间上重叠运行它们,那么函数永远不会完成并且它们会超时。
我看不出并发问题可能来自哪里。这些函数通过 EF 从 Azure SQL 读取数据,并将结果写入 Azure 存储上的不同 blob。
这两个功能之前在 Azure 应用服务中托管的 ASP.NET MVC Web 应用(Web 应用)中作为 Web 作业实现,并同时正常运行。
当我将这两个 webjobs 移动到 Azure Functions 应用程序时,我实际上将 Web App bin 文件夹的内容复制到了 Function App bin 文件夹中,然后在每个函数中引用了必要的 dll。
我认为这个并发问题的一个原因是复制 Web App bin 文件夹的内容。
我能想到的另一个原因是,如果消耗计划没有对每个新功能的内存进行预算,因此无法正确扩展。例如,如果触发的新函数本身需要大量内存,则可能应该将其分配给新的计算实例,而不是共享以前的计算实例。因为我的函数占用大量内存,所以如果第一个函数分配给一个小型计算实例,而第二个函数分配给同一个小型计算实例,则两者可能一起超过导致超时的限制。
编辑
根据 Matt Mason MSFT 的建议获得更多结果。
- 使用第二个函数应用程序。同样处于消费模式并具有相同的 bin 文件夹中的文件。我能够同时运行这两个功能 时间在不同的功能应用程序上,他们成功完成。这 让我相信问题应该来自功能应用程序和 不在 Azure SQL 或 Blob 存储依赖项上。
但是,在单独的应用程序中运行函数不是可接受的解决方案。
【问题讨论】:
-
您是否正在为 EF 使用 Db 连接的共享(静态)实例?在同一底层主机上运行的函数共享一个 AppDomain,这可能会导致一些奇怪。
-
每个函数都在转换自己的 EF DbContext 实例。作为附加结果。我可以在不同的函数应用程序上同时运行这两个函数(参见上面的编辑)。
标签: azure azure-webjobs azure-functions