2017-09-26 1 views
0

Je souhaite envoyer un événement que je reçois du concentrateur d'événements à plusieurs sujets dans le bus de service. J'utilise le code suivant pour envoyer des événements à plusieurs sujets en utilisant foreach pour obtenir topicname. Puisqu'il s'agit d'une boucle foreach, je reçois de la latence. Y a-t-il une meilleure façon de le faire?Envoi d'un événement à plusieurs sujets dans le bus de service

foreach (var topicname in GetTopics_ActiveList(payload).Result) 
        { 
         TopicClient Client = TopicClient.CreateFromConnectionString(connectionstring, topicname); 
         var payloadStream = new MemoryStream(Encoding.UTF8.GetBytes(payload)); 
         //var msg = JsonConvert.SerializeObject(payloadStream); 

         //BrokeredMessage message = new BrokeredMessage(payloadStream, true); 
         BrokeredMessage message = new BrokeredMessage(payloadStream); 
         Client.Send(message); 
        } 

Répondre

0

Y at-il une meilleure façon de le faire.

Toujours. Pour un démarreur, vous pouvez mettre en cache vos clients plutôt que de créer à chaque fois. Deuxièmement, utilisez la version d'envoi asynchrone de la méthode Send (SendAsync), mais plutôt que d'en envoyer une à la fois, rassemblez les tâches et attendez avec Task.WhenAll. Et construisez votre message négocié une fois et clone it dans la boucle. Quelque chose entre les lignes de

var msg = BuildYourMessage(); 
var sendTasks = new List<Task>(); 
foreach (var topic in topicsCache) 
{ 
    sendTasks.Add(client.SendAsync(msg.Clone())); 
} 
Tasks.WhenAll(sendTasks).ConfigureAwait(false); 

La question que je vous est de savoir pourquoi l'envoyer aux sujets multiples plutôt qu'un seul sujet avec plusieurs abonnements? Peut-être que vous pourriez vous en sortir avec un seul envoi à ce sujet, en déléguant à Azure Service Bus pour effectuer la diffusion à tous les abonnements.

+0

1. Je ne serai pas en mesure de mettre mes clients en cache, car cela dépend des événements que je suis en train de traiter. Chaque événement va à un certain nombre de sujets. 2.Je peux avoir plusieurs abonnements dans un même sujet, mais lorsque le nombre d'abonnements augmente, il finit par ralentir. Merci pour la réponse rapide. –

+0

Je ne suis pas sûr de # 2. La distribution d'un message envoyé à un sujet aux abonnements est effectuée sur le courtier. Il semble vraiment que ce serait plus lent que d'envoyer des messages individuels à tous les sujets. –

+0

# 2 Vous pourriez avoir raison et l'autre raison pour laquelle nous utilisons des sujets est parce que si nous allons avec des abonnements alors il n'a aucune chaîne de connexion par abonnement finalement nous devons partager la chaîne de connexion de sujet à chaque écouteur, s'ils connaissent le autre nom d'abonnement dans le sujet qu'ils seraient en mesure d'écouter les messages. –