2 votes

QueueClient.CreateFromConnectionString met-il en cache la connexion interne ?

J'ai un point de terminaison HTTP dans une application ASP.NET Core qui envoie quelques messages à Azure Service Bus.

Actuellement, c'est le code d'action du contrôleur qui s'en charge :

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

Le QueueClient créé ne prend pas en charge la fonction Dispose Je me demande donc quelle devrait être sa durée de vie. J'en crée une nouvelle par requête HTTP. Est-ce que la fonction CreateFromConnectionString La méthode de cache des connexions internes au bus de service ? Quelle est la solution optimale dans ce cas ? Je pose la question parce que j'ai reçu des messages de la part de TimeoutExceptions du bus de service dernièrement lors des pics de trafic.

1voto

Bruce Chen Points 14187

Comme l'indique ce document officiel document mentionne le client Service Bus :

Les objets clients du bus de service, tels que QueueClient ou MessageSender, sont créés à l'aide d'une commande MessagingFactory qui est également assure la gestion interne des connexions . Vous ne devez pas fermer les usines de messagerie ou les clients de file d'attente, de sujet et d'abonnement après l'envoi d'un message, puis les recréer lors de l'envoi du message suivant . La fermeture d'une usine de messagerie supprime la connexion au service Service Bus, et une nouvelle connexion est établie lors de la recréation de l'usine. L'établissement d'une connexion est une opération coûteuse que vous pouvez éviter en réutilisant la même fabrique et les mêmes objets clients pour plusieurs opérations. Vous pouvez utiliser en toute sécurité l'objet QueueClient pour envoyer des messages à partir d'opérations asynchrones simultanées et de plusieurs fils d'exécution. .

Je pose la question parce que j'ai reçu dernièrement des TimeoutExceptions de la part du bus de service lors de pics de trafic.

Comme indiqué dans le document officiel document sur la messagerie du bus de service TimeoutException :

Une exception TimeoutException indique qu'une opération initiée par l'utilisateur prend plus de temps que le délai d'attente de l'opération. Vous devez vérifier la valeur de la variable ServicePointManager.DefaultConnectionLimit car le dépassement de cette limite peut également provoquer une erreur d'affichage. TimeoutException .

J'ai supposé que vous pouviez essayer d'augmenter OperationTimeout et ajoutez la logique de réessai comme suit pour construire votre QueueClient et réutiliser cet objet QueueClient.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X