Windows 容器导致 Azure SQL 连接失败

Windows containers causes Azure SQL connections to fail

我已经为我的 .NET 程序创建了一个 Docker 文件。该程序 运行 在我的桌面和没有 Docker 的 Windows Server 2016 (Azure VM) 上运行良好。当我尝试 运行 它作为容器(基于 microsoft/windowsservercore)时,在连接到我的 Azure SQL 实例时,我经常遇到数据库错误。

我有两个 Azure SQL 实例 运行ning(P1 且无负载)。当可以建立连接时,它们很快,但问题是经常无法建立连接。看来网络很不稳定。这些是向我抛出的典型错误:

System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)

内部异常报告找不到网络路径。起初我以为它可能是我的本地机器,但它在 Azure 中的 Windows Server 2016(带容器)VM 实例上也有问题。

为了查明问题所在,我创建了一个测试程序,每 5 秒(和 运行s SELECT COUNT(*) from sysobjects)连接到我的数据库。这个程序总能成功找到数据库。

看来我的另一个程序在启动时经常失败,但是在初始化时有很多数据库调用。我怀疑线程、连接池、...

有什么不同

有人知道吗?

错误消息来自 命名管道提供商 ,这似乎很奇怪,因为 Azure SQL 只能通过 TCP/IP 连接。不知何故,它似​​乎退回到命名管道,这可以通过在主机名前加上前缀 tcp: 来防止。所以,我的连接字符串看起来像:

Server=tcp:example.database.windows.net;Database=<dbname>;User Id=...

这可以防止服务器回退以尝试使用命名管道,我再也没有遇到过这个问题。

遗憾的是,我还没有找到在某些情况下使用命名管道提供程序的原因。应该是microsoft/windowsservercore镜像内部的一些配置引起的,因为我从来没有看到Docker镜像外的错误信息。否则,我会怀疑Azure SQL的节流机制(虽然负载很低)。

目前,Windows 容器也遇到了更多网络问题。但是对于软件定义的网络,就像您在 Azure/Containers 中所拥有的那样,一般建议在适当的位置设置一些重试逻辑。

如果您正在使用 Entity Framework,您可以插入不同的弹性和重试策略“SqlAzureExecutionStrategy”。这不仅适用于 Azure 通常的容器,而且有助于减少异常。

本文介绍了如何: https://msdn.microsoft.com/en-us/library/dn456835(v=vs.113).aspx