首页 > 解决方案 > 升级到 netcoreapp3.1 和函数 v3 时函数应用程序行为异常

问题描述

我正在调查一个在 Azure 上部署的函数应用程序上发生的奇怪行为,该应用程序服务计划是一个专门的应用程序服务计划。当升级到 netcore3.1 和 Functions V3 时,应用程序在连接到 SQL DB 时开始出错,因为 DTU 限制受到影响。

函数应用由 3 个项目组成:

该函数应用程序包含各种函数(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 包版本:

我对进一步调查这件事有点不知所措。关于可能导致这种情况的任何想法?

非常感谢

标签: c#azureazure-functions.net-core-3.1azure-function-app

解决方案


推荐阅读