【问题标题】:Azure SQL Connection DelayAzure SQL 连接延迟
【发布时间】:2022-01-25 15:16:50
【问题描述】:

我有一个托管在应用服务计划上的 .NET Core Azure Functions 应用。该计划专用于独立定价层。 Functions 应用已打开 Always On 设置。出于某种原因,该应用在连接到 Azure SQL 数据库时出现问题。该数据库与 Functions 应用在同一区域运行,并且具有关键业务定价层。

我在 Application Insights 中看到 API 调用需要几秒钟才能完成,因为代码路径正忙于等待获取 SQL 连接。实际的数据库操作在几毫秒内完成。

我已经在本地运行了应用程序,并将数据库连接字符串设置为 Azure SQL 数据库,并且完全没有看到任何延迟。每个请求在几毫秒内完成。然后,我使用专用的应用服务计划在现有应用服务环境之外创建了一个新的 Azure Functions 应用。结果是一样的,一点延迟都没有。

问题

以前是否有人遇到过此类问题,或者对可能出现的问题有任何想法? Azure App Service Environment 使用的任何网络网关是否可能导致此问题?

附:应用服务环境中的其他应用也面临此问题,但请求量较少。

【问题讨论】:

  • 如果没有看到代码,真的很难提供帮助。我的猜测是您没有正确处理连接/使用连接池。另一个可能的原因可能是使用了阻塞连接的同步操作
  • @ThiagoCustodio 一开始我也是这么想的。所以我检查了数据库调用并没有找到类似的东西。我正在使用PetaPoco library 进行数据库调用。所有的调用都是同步的。我也检查了库的相关代码,发现连接在库本身的 Query、Execute 等调用上关闭。然后我在连接字符串上将最大连接池大小设置为 1 并测试了应用程序。但没有 TimeoutException 或响应缓慢的问题。如果应用负载不重,是否会因同步操作而导致连接阻塞?
  • 此外,延迟总是固定在 14 秒左右。
  • 您最好检测应用程序(使用应用程序洞察力)尝试找出瓶颈在哪里/为什么会挂起
  • @ThiagoCustodio 我已经这样做了,并且看到操作花费的时间太长了。因为它正在等待连接。 Application Insights 分析也向我展示了同样的事情。 SqlClient 正在等待获取连接。但这不会发生在应用服务环境之外。

标签: azure azure-functions azure-sql-database azure-app-service-plans azure-app-service-envrmnt


【解决方案1】:

重试 SQL 数据库和 SQL 托管实例连接或重新建立连接,具体取决于以下情况:

· 连接尝试期间出现暂时性错误

延迟几秒后,重试连接。

· 在 SQL 数据库和 SQL 托管实例查询命令期间发生暂时性错误

不要立即重试该命令。相反,在延迟之后,重新建立连接。然后重试该命令。

重试间隔增加

您需要等待 5 秒钟才能首次重试。在少于 5 秒的延迟后重试可能会使云服务不堪重负。对于随后的每次重试,延迟应呈指数增长,最长可达 60 秒。

使用 ADO.NET 的客户端的阻塞期,请参阅 Connection pooling (ADO.NET)

设置程序自行终止前的最大重试次数。

请参阅 here 以解决常见 SQL 连接问题

当您在 SQL 服务器中使用 MARS 时,它是一个不会影响连接行为的序列执行。

MARS 中的连接池

启用 MARS 的连接像任何其他连接一样被池化。如果应用程序打开两个连接,一个启用 MARS,一个禁用 MARS,则这两个连接位于不同的池中。

对于 MARS 连接,默认执行环境与连接相关联。给定连接下的每次执行都会收到默认环境的副本。执行完成后,会将执行设置复制到默认环境中。

请参阅 here 以启用/禁用多个活动结果集 (MARS)

【讨论】:

  • 我实际上并没有收到很多瞬态错误。我面临的问题是建立与 SQL Server 的连接延迟大约 14 秒。我曾考虑过重试延迟,但我没有在连接字符串中设置连接重试值。因此,该值应该是默认值。所以,即使立即重试,建立连接也不应该花那么长时间,对吧?而且这种延迟只发生在应用服务环境上。我在应用服务环境之外托管了相同的应用程序,但采用了基本的应用服务计划。延迟以毫秒为单位。
  • 问题仍然存在?
  • 我发现延迟是由于 ASE 和 Azure SQL DB 之间的高 DNS 延迟造成的。我有 Azure 网络经验的队友正在研究它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多