2017-09-27 1 views
0

Wir verwenden Azure-Blobspeicher, um eingehende Nachrichten aus einem Datenfeed zu speichern (wir erhalten täglich etwa 1,5 GB Daten) und verarbeiten sie dann, was über eine Nachricht ausgelöst wird Warteschlange (rabbitmq). Hier ist, wie das Setup wie folgt aussieht:Azure Blob Storage .Net-Clientbibliothek und TCP-Verbindungen im Zeitverlauf

Hersteller -> Speichern von XML-Datei in Azure Blob -> Adresse veröffentlichen blob

Consumer Warteschlange -> Lesen Sie die blob-Adresse aus der Warteschlange -> Download Klecks im Speicher

und hier ist die Download-Blob-Methode, die für jede Nachricht ausgeführt wird:

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); 
} 

Diese Pipeline wird mit einem ziemlich häufigen Tempo laufen und daher sehen wir, dass im Laufe der Zeit (einige Wochen) startet das Programm Fehler Sockel erhalten. Hier ist die Spur:

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 

Das ist wie ein Problem scheint mit nicht-Verbindungen effizient Umgang hatten wir versuchen blobClient Wiederverwendung, aber das hat uns nicht geholfen. Woran sollen wir weitergehen, um das zu lösen?

Antwort

1

Microsoft.WindowsAzure.Storage.StorageException: kann keine Verbindung zum Remote-Server ---> System.Net.WebException verbinden: kann keine Verbindung zum Remote-Server ---> System.Net.Sockets.SocketException verbinden: ein Vorgang auf einem Socket konnte nicht ausgeführt werden, weil das System Pufferspeicher fehlte oder eine Warteschlange voll war 40.68.232.24:443 (blob.am5prdstr02a.store.core.windows.net)

Per meinem Verständnis, es kann TCP/IP Port Erschöpfung sein. Ich nahm an, dass Sie Netstat verwenden können, um den Status Ihrer Netzwerkverbindungen und der Ports abzufragen, die Sie verwenden. Weitere Informationen finden Sie unter here, um Erläuterungen und Möglichkeiten zur Diagnose dieses Problems zu erhalten.

Wenn die Port Erschöpfung in Ihrem Client-Computer auftritt, nehme ich an, Sie könnten den oberen Bereich der kurzlebigen Ports für Client-TCP/IP-Socket-Verbindungen erhöhen und das Client-TCP/IP-Socket-Verbindungstimeout reduzieren, für weitere Details könnten Sie siehe here. Außerdem können Sie Ihre Client-Anwendung auf mehrere Instanzen unter verschiedenen Computern skalieren.

+0

Skalierung durch Teilen von Instanzen auf verschiedenen Computern wird definitiv helfen. Aber das Problem, mit dem wir konfrontiert sind, ist, dass TCP-Verbindungen mit TIME_WAIT über die Zeit dazu führen, dass die Ports erschöpft sind. – maulik13

Verwandte Themen