2017-09-26 8 views
0

イベントハブから受信している1つのイベントをサービスバスの複数のトピックに送信したいとします。私は、トピック名を取得するためにforeachを使用して複数のトピックにイベントを送信するために、次のコードを使用しています。 これはforeachループなので、待ち時間が増えています。それを行うための良い方法はありますか?サービスバス内の複数のトピックに1つのイベントを送信

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

答えて

0

それを行うための任意のより良い方法はあります。

常に。初心者のために、毎回作成するのではなく、クライアントをキャッシュすることができます。次に、Sendメソッドの非同期送信バージョン(SendAsync)を使用しますが、一度に1つずつ送信するのではなく、タスクを収集してTask.WhenAllを待ちます。そしてあなたの仲介されたメッセージを一度構築し、ループ内でclone itを構築してください。

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

私が持っている質問は、複数のサブスクリプションで1つのトピックではなく複数のトピックに送信する理由です。おそらく、あなたはそれを離れて、そのトピックに単一の送信を行い、すべてのサブスクリプションにブロードキャストを実行するAzure Service Busに委任することができます。

+0

1.処理中のイベントによってクライアントが変更されるためキャッシュできません。各イベントは特定の数のトピックに移動します。 2. 1つのトピックに複数のサブスクリプションを含めることはできますが、サブスクリプション番号が上がると、最終的には減速します。迅速な対応に感謝します。 –

+0

#2については分かりません。トピックに送信されたメッセージのサブスクリプションへの配布は、ブローカ上で行われます。すべてのトピックに個別のメッセージを送信するよりも時間がかかりそうです。 –

+0

#2あなたが正しいかもしれないし、話題を使用している他の理由は、サブスクリプションと一緒に行くとサブスクリプションごとに接続文字列がないため、最終的にはすべてのリスナーにトピックの接続文字列を共有する必要があるからですトピック内の他のサブスクリプション名は、メッセージを聞くことができます。 –

関連する問題