1

Ich habe einen HTTP-Endpunkt in einer ASP.NET Core App, der einige Nachrichten an Azure Service Bus sendet.Interpretiert QueueClient.CreateFromConnectionString interne Verbindung?

Im Moment funktioniert der Controller-Aktion Code folgendermaßen aus:

var client = QueueClient.CreateFromConnectionString(this.connectionString, entityPath); 
await client.SendAsync(message); 

Die QueueClient die erstellt wird, unterstützt nicht Dispose so frage ich mich, wie lange seine Lebenszeit sein sollte? Ich erstelle eine neue per HTTP-Anfrage. Verwendet die Methode CreateFromConnectionString des QueueClients interne Verbindungen zum Servicebus? Was ist hier die optimale Lösung? Ich frage, weil ich kürzlich TimeoutExceptions vom Dienstbus während der Verkehrsspitzen erhalten habe.

Antwort

1

Als diese offiziellen document über Service Bus Client erwähnt:

Service Bus Client-Objekte, wie QueueClient oder Message, werden durch ein MessagingFactory Objekt erstellt, die auch interne Verwaltung von Verbindungen. Sie sollten Nachrichtenfabriken oder Warteschlangen-, Zweig- und Subskriptionsclients nach dem Senden einer Nachricht nicht schließen und sie dann erneut erstellen, wenn Sie die nächste Nachricht senden. Durch das Schließen einer Nachrichtenfabrik wird die Verbindung zum Service-Bus-Dienst gelöscht, und beim Neuerstellen des Werks wird eine neue Verbindung hergestellt. Das Herstellen einer Verbindung ist eine kostspielige Operation, die Sie vermeiden können, indem dieselben Factory- und die Clientobjekte für mehrere Vorgänge erneut verwenden. Sie können das QueueClient-Objekt für das Senden von Nachrichten von gleichzeitigen asynchronen Operationen und mehreren Threads verwenden.

Ich frage, weil ich habe TimeoutExceptions aus dem Linienbus in letzter Zeit bei Verkehrsspitzen zu empfangen.

Wie in den offiziellen document über Service Bus-Messaging-Timeout erwähnt:

Eines Timeout zeigt an, dass eine vom Benutzer initiierte Operation länger als die Operation Timeout nimmt. Sie sollten den Wert der ServicePointManager.DefaultConnectionLimit-Eigenschaft überprüfen, da das Erreichen dieses Limits auch eine TimeoutException verursachen kann.

ich davon ausgegangen, dass Sie OperationTimeout zu erhöhen versuchen könnte, und Wiederholungslogik wie folgt hinzufügen Ihre QueueClient zu bauen und diese QueueClient Objekt wiederverwenden.

var builder = new ServiceBusConnectionStringBuilder("{ServicesBusConnectionString}") 
{ 
    OperationTimeout = TimeSpan.FromMinutes(5) 
}; 
var messagingFactory = MessagingFactory.CreateFromConnectionString(builder.ToString()); 
QueueClient queueClient = messagingFactory.CreateQueueClient("{queueName}"); 
queueClient.RetryPolicy = new RetryExponential(
       TimeSpan.Zero, 
       TimeSpan.FromMinutes(5), 
       2); 
queueClient.SendAsync("{BrokeredMessage}"); 
+1

Ich habe das schon gelesen, aber ich benutze MessagingFactory nicht direkt. Stattdessen verwende ich die statische QueueClient.CreateFromConnectionString-Methode. Schließt dies die MessagingFactory oder gibt es eine einzige statische, die von der statischen QueueClient-Klasse verwendet wird? Dies ist der Fall, wenn die Dokumente fehlschlagen. Vielleicht verwende ich den Code, den Sie zur Verfügung gestellt haben, wenn niemand anders das klären kann. –

+0

Ich werde auch hinzufügen, dass ich nur die DefaultConnectionLimit erhöht, obwohl alles, was ich gelesen habe angibt, dass nur für HTTP-Aufrufe ist und ASB ein proprietäres TCP-Protokoll verwendet. –