如何避免 Azure Function App 中的 Sql 超时

How to avoid Sql Timeout in Azure Function App

我在 .Net Standard 2.0 中开发了一个基于队列触发器的函数应用程序。 当应用程序因维护或新版本而停机时,队列中可能有超过 20000 条消息。 基本上,该应用程序使用 XMLReader 读取每个 xml 文件的内容并为其创建一条记录。这些记录直接插入到 Azure SQL 数据仓库中。 但是当应用程序重新启动时,我们会遇到一些依赖错误,都是由于 SQL-登录错误。

  System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired.
The timeout period elapsed during the post-login phase.
The connection could have timed out while waiting for server to complete the login process and respond; Or it could have timed out while attempting to create multiple active connections.
This failure occurred while attempting to connect to the routing destination.
The duration spent while attempting to connect to the original server was - [Pre-Login]

查看 Datawarehouse 的统计信息时,我可以看到当时有 800 多个连接处于活动状态。所以我知道这可能太多了,但我怎么能解决这个问题,我认为没有办法限制同时运行的功能应用程序的数量,...

如果有人有想法(即使是周六晚上),请随意。

PS: 在正常操作中,该功能工作正常,只是在重新启动时它触发得太快了...

我想进一步了解该应用程序,因为这是加载 ASDW 的反模式。

满足此要求的更正常方法是将 XML 分解为微批处理文件,然后使用 Polybase 摄取文件。根据您的着陆区结构,即使重新启动也是一项非常简单的任务。

您属于哪个 DWU 运行?这种模型的并发影响可能很大,不仅性能差,而且对当时的其他工作负载也有负面影响。

回复后编辑:

如果我必须处理这样的工作负载,我会使用 EventHub 或 Kafka 到 Databricks,切碎 XML,然后写入 ASDW。这是一个很好的例子,每 30 秒将微批次更新为 DW:

https://azure.microsoft.com/en-au/blog/near-real-time-analytics-in-azure-sql-data-warehouse/

此方法将使用 Polybase 将数据提取到 ASDW,这将比 SQL 插入快得多,并提供增强的并发性。

如果您正在执行消费计划,则发生这种情况的原因可能是您的函数应用程序由于大量队列消息积压而被大规模扩展。在这种情况下,WEBSITE_MAX_DYNAMIC_APPLICATION_SCALE_OUT 记录的 here 将帮助您限制您的应用程序运行的虚拟机数量(尽管由于系统在遇到容量限制时的行为方式,这不是 100% 保证的限制) .

这个问题跟踪改善这方面的整体体验,但没有预计到达时间: https://github.com/Azure/azure-functions-host/issues/1207