我最近将我的Azure Functions 2应用程序(针对.NET Core 2.2)更新为Azure Functions 3(针对.NET Core 3.1)。此升级不包括代码或逻辑更改,仅包括框架和程序包更新。
这是变更集的范围。
上一个项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
...
</Project>
更新的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
...
</Project>
我具有HTTP触发功能,该功能从Azure Table Storage数据库读取数据。此功能已经在生产中工作了将近一年,没有任何问题。部署升级的(v3)Functions应用程序后,在调用从Azure Table Storage读取数据的HTTP触发函数期间,我观察到很多OutOfMemoryException
出现。结果为500。该功能确实可以在不抛出OutOfMemoryException
的情况下正常工作。我不知道成功与失败之间的区别。
这是发生异常的方法:
private async Task<IEnumerable<T>> ExecuteQuery<T>(CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
{
var results = new List<T>();
TableContinuationToken token = null;
do
{
// Read entities from each query segment.
var segment = await table.ExecuteQuerySegmentedAsync(query, token);
token = segment.ContinuationToken;
results.AddRange(segment); // Build collection of records.
}
while (token != null);
return results;
}
Application Insights显示,此do/while
循环在OutOfMemoryException
发生之前成功执行了大约四到六次(不一致)的查询段。经过数小时的尝试,即使指向相同的Azure Table Storage实例,我也无法在本地复制此错误。
我确实将功能应用程序的FUNCTIONS_EXTENSION_VERSION
应用程序设置从~2
更改为~3
。
此应用程序中还有其他一些HTTP触发功能和计时器触发功能,它们可以从其他来源读取/写入数据,并且可以正常工作。甚至还有一个HTTP触发功能,可以将数据成功写入同一Azure表存储表,从而在读取期间导致问题。目前,我已经重新部署了针对v2的Azure Functions应用程序的构建(并且不再有OutOfMemoryException
)。
有人对我可能错过的内容或解决此OutOfMemoryException
问题有什么想法吗?
UPDATE
此OutOfMemoryException
问题仅在Azure Functions应用程序平台设置为64位时发生。当设置为32bit时,不再出现OutOfMemoryExceptions异常。