我将 Azure Functions 与队列触发器一起用于我们的部分工作负载。特定函数查询数据库,这会导致扩展问题,因为大量并发函数实例 ping 数据库导致最大允许数量的 Azrue DB 连接不断被命中。

本文 https://docs.microsoft.com/en-us/azure/azure-functions/manage-connections 将 HttpClient 列为应设为静态的资源之一。
是否也应该使用静态 SqlConnection 使数据库访问静态化以解决此问题,还是通过保持恒定连接对象会导致一些其他问题?

最佳答案



当然不。每个函数调用都应该在 using 块中打开一个具有相同连接字符串的新 SqlConnection。不太清楚运行时将对应用程序的单个实例进行多少次并发函数调用。但如果它大于 1,那么单例 SqlConnection 是一件坏事。

我想知道您在 SQL 数据库中使用的是哪个 limit,是连接限制还是并发请求限制?在任何一种情况下,我都有些惊讶(不是函数专家)你得到这么多并发函数调用,所以可能还有其他事情发生。就像你在泄漏 SqlConnections。

但是阅读 Functions 文档,我的猜测是函数运行时正在通过启动函数应用程序的多个实例进行扩展。您的 .NET 应用程序可以在单个进程中扩展,但这显然不是 Functions 的工作方式。 Functions 应用程序的每个实例都有自己的 SQL Server ConnectionPool,默认情况下,每个 ConnectionPool 可以有 100 个连接。

也许如果您在连接字符串中严格限制最大池大小,就不会打开这么多连接。当您达到最大池大小时,对 SqlConnection.Open() 的新调用将阻塞长达 30 秒,等待池化的 SqlConnection 变为可用。因此,这不仅限制了应用程序每个实例的连接使用,还限制了负载下的吞吐量。

关于Azure Functions 静态 SqlConnection - 正确的缩放方式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50766009/

10-14 12:02