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?
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