【问题标题】:Azure Blob storage .Net client library and TCP connections over time随着时间的推移,Azure Blob 存储 .Net 客户端库和 TCP 连接
【发布时间】:2018-03-08 14:23:31
【问题描述】:

我们使用 Azure blob 存储来存储来自数据馈送的传入消息(我们每天接收大约 1.5GB 的数据),然后通过消息队列 (rabbitmq) 触发处理它们。设置如下所示:

生产者 -> 在 Azure blob 中存储 XML 文件 -> 将 blob 地址发布到队列

消费者 -> 从队列中读取 blob 地址 -> 将 blob 下载到内存中

这里是为每条消息执行的下载 blob 方法:

private string GetBlobText(string containerName, string blobName)
{
    // Parse the connection string and return a reference to the storage account.
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Settings.Default.DatafeedStorageConnString);
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    return blockBlob.DownloadText(Encoding.UTF8);
}

此管道以相当频繁的速度运行,因此我们看到随着时间的推移(几周),程序开始收到 Socket 错误。这是跟踪:

Microsoft.WindowsAzure.Storage.StorageException: Unable to connect to the remote server ---> System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full 40.68.232.24:443
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 695
   --- End of inner exception stack trace ---
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 604
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.DownloadRangeToStream(Stream target, Nullable`1 offset, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlob.cs:line 675
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.DownloadToStream(Stream target, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlob.cs:line 234
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.DownloadText(Encoding encoding, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1279

这似乎是一个无法有效处理连接的问题,我们曾尝试重用 blobClient,但这对我们没有帮助。我们应该进一步研究什么来解决这个问题?

【问题讨论】:

    标签: c# .net sockets azure azure-blob-storage


    【解决方案1】:

    Microsoft.WindowsAzure.Storage.StorageException: 无法连接到远程服务器 ---> System.Net.WebException: 无法连接到远程服务器 ---> System.Net.Sockets.SocketException: 上的操作无法执行套接字,因为系统缺少足够的缓冲区空间或队列已满 40.68.232.24:443 (blob.am5prdstr02a.store.core.windows.net)

    据我了解,可能是 TCP/IP 端口耗尽。我假设您可以使用 Netstat 来查询您的网络连接状态和您正在使用的端口。有关详细信息,您可以参考here 了解此问题的解释和诊断方法。

    如果您的客户端计算机发生端口耗尽,我假设您可以增加客户端 TCP/IP 套接字连接的临时端口的上限范围并减少客户端 TCP/IP 套接字连接超时,有关更多详细信息,您可以参考到here。此外,您可以将客户端应用程序扩展到不同计算机之间的多个实例。

    【讨论】:

    • 通过在不同计算机上拆分实例进行扩展肯定会有所帮助。但我们面临的问题是,在这段时间内,带有 TIME_WAIT 的 TCP 连接会耗尽端口。
    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2020-08-22
    • 2022-12-15
    • 2022-01-07
    • 2016-06-13
    • 2020-05-20
    相关资源
    最近更新 更多