【问题标题】:How to avoid Sql Timeout in Azure Function App如何避免 Azure Function App 中的 Sql 超时
【发布时间】:2018-10-06 20:36:14
【问题描述】:

我在 .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]

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

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

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

【问题讨论】:

  • 你的连接字符串是什么样子的?
  • 我只是在使用连接字符串构建器connSql = EnergySql.CreateDBConnection(CommonCode.GetEnvironmentVariable("SQLDW_Datasource"), CommonCode.GetEnvironmentVariable("SQLDW_InitialCatalog"), CommonCode.GetEnvironmentVariable("SQLDW_User"), CommonCode.GetEnvironmentVariable("SQLDW_Password"));
  • 从这篇文章docs.microsoft.com/en-us/azure/sql-data-warehouse/…你可以配置连接字符串的超时时间。它说您应该将超时配置为 300 秒。你能试试这个吗?

标签: azure azure-functions azure-sqldw


【解决方案1】:

我想进一步了解该应用程序,因为这是加载 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 插入快得多,并提供增强的并发性。

【讨论】:

  • 这是机车在安全的 ESB 上发送的实时数据,并通过 Axway 传送到 BlobStorage 中。在高峰时刻,10 分钟内最多可处理 15K 个文件。内容是 XML,但不是重复块。由于大量的数据和报告,我们试图直接插入数据仓库。但由于它不知道 XML 数据类型,我创建了一个由事件订阅触发的简单 Azure 函数,从 BlobStor 上的文件创建到 St-Queue。 App 使用 XMLTextReader 将 blob 读取到一个类中,然后将其插入到 DW 上的记录中(1Rec-75fields)。
  • 我们为应用程序使用消费计划,DW 正在测试 DW200。抱歉在 2 中发布,不知道如何添加更长的评论,我肯定无法回答我的问题.
  • 更新响应。
【解决方案2】:

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

此问题跟踪改进了该领域的整体体验,但没有预计到达时间: https://github.com/Azure/azure-functions-host/issues/1207

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2015-12-11
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多