c# - 升级到 netcoreapp3.1 和函数 v3 时函数应用程序行为异常
问题描述
我正在调查一个在 Azure 上部署的函数应用程序上发生的奇怪行为,该应用程序服务计划是一个专门的应用程序服务计划。当升级到 netcore3.1 和 Functions V3 时,应用程序在连接到 SQL DB 时开始出错,因为 DTU 限制受到影响。
函数应用由 3 个项目组成:
- ProductService.dll(包含函数) - netstandard2.0
- ProductService.Indexer.dll(库)-netstandard2.0
- ProductService.Shared.dll(库)-netstandard2.0
该函数应用程序包含各种函数(60 个 http、16 个队列和 4 个计时器),共有 80 个函数。Http 触发器的利用率非常低(例如,每天 < 1k 个请求,在一天中分散)。另一方面,队列触发器不断触发。
SQL DB 是在 SQL 弹性池上运行的 Azure SQL Server DB,最大使用限制为 200 个 DTU。
目前在 netstandard2.0 和 Functions v2 上运行,完全没有问题。
供您参考下面的 host.json
{
"functionTimeout": "12:00:00",
"version": "2.0",
"extensions": {
"queues": {
"visibilityTimeout": "00:05:00",
"batchSize": 16,
"newBatchThreshold": 8
}
}
}
所做的唯一代码更改(在升级到 netcoreapp3.1 期间)是使用 HttpClientFactory 而不是 HttpClient 的自定义包装器。部署 ProductService 的 netcoreapp3.1 版本并将 azure Function 应用更改为 v3 时,应用程序开始出错,因为达到了 SQL DB DTU 限制。我一直在努力理解,我一直在问为什么应用程序会在升级后对数据库施加更大的压力?与 v2 相比,v3 函数主机现在能够执行更多调用吗?
然后,我尝试通过将 host.json 中的 batchSize 降低到 8 并将 newBatchThreshold 降低到 4 来减少 host.json 配置中的队列触发器并行性,并且问题似乎消失了(或者至少偶尔发生一次)。但是,通过这样做,我将无法满足我的全部要求,并且消息开始堆积在队列中。
我确保我使用的是所有最新版本的依赖 nuget 包。只是为了提供尽可能多的信息,这里是应用程序所依赖的 nuget 包版本:
- Microsoft.Azure.WebJobs 3.0.19
- Microsoft.NET.Sdk.Functions 3.0.9
- Microsoft.Extensions.Caching.Memory 3.1.8
- Microsoft.Extensions.Configuration.Binder 3.1.8
- Microsoft.Extensions.DependencyInjection 3.1.8
- Microsoft.Extensions.DependencyInjection.Abstractions 3.1.8
- Microsoft.Extensions.Http.Polly 3.1.8
- 波莉 7.2.1
- Polly.Extensions.Http 3.0.0
- Microsoft.Azure.WebJobs.Extensions.Storage 3.0.11
- System.Data.SqlClient 4.8.2
- Microsoft.Rest.ClientRuntime 2.3.21
- Microsoft.Rest.ClientRuntime.Azure 3.3.19
我对进一步调查这件事有点不知所措。关于可能导致这种情况的任何想法?
非常感谢
解决方案
推荐阅读
- ios - 以 CGRect 绘制的圆形图像具有白色背景
- django - 带有 jinja2 FormHelper 支持的 django-crispy-forms
- pandas - 使用 pandas 追加一个 .xslx 文件是不是覆盖了它?
- java - Java 检查函数是否已被调用
- github - 发布时的 Github Action 触发器在标签上不起作用
- typescript - 构造一个新的可配置类
- c++ - 无法在地图中打印地图中的矢量值
- python - 在 dag 中增加或减少 ts_nodash 秒数
- javascript - JavaScript 中的 find() 与 map()
- arrays - 如何使用指针算法操作二维数组中的列和行