2016-07-17 6 views
4

Azure Service Busを使用してWindowsサービスのスループットを向上させようとしています。私が気づいたことは、私がこのようなコードを持っていればそれです。Azureサービスバスの読み取りパフォーマンス

オプションは、一定数(私がやっている何のために、通常は12〜16)の後にはほとんど効果がないMaxConcurrentCallsを増やす

OnMessageOptions options = new OnMessageOptions 
      { 
       MaxConcurrentCalls = maxConcurrent, 
       AutoComplete = false 
      }; 

ある

client.OnMessageAsync(async message => 
      { 
       var timer = new Stopwatch(); 
       timer.Start(); 
       bool shouldAbandon = false; 
       try 
       { 
        // asynchronouse processing of messages 
        await messageProcessor.ProcessAsync(message); 
        Interlocked.Increment(ref SimpleCounter); 
        // complete if successful processing 
        await message.CompleteAsync(); 
       } 
       catch (Exception ex) 
       { 
        shouldAbandon = true; 
        Console.WriteLine(ex); 
       } 

       if (shouldAbandon) 
       { 
        await message.AbandonAsync(); 
       } 
       timer.Stop(); 
       messageTimes.Add(timer.ElapsedMilliseconds); 
      }, 
      options); 

しかし、同じMaxConcurrentCallsで複数のクライアント(QueueClient)を作成すると、パフォーマンスが向上します(ほぼ直線的に)。

私がやっていることは、#queueclientとmaxconcurrentcallsを設定可能にすることですが、複数のqueueclientsを持つのが最善の方法だろうと思います。

私の質問は:Windowsサービスと紺色のサービスバスの悪いまたは良い練習を実行しているメッセージポンプで複数のqueueclientsがあるかどうかです。

+0

サーバーのコア数はいくつですか? Windowsサービスのすべてのインスタンスが同じサーバー上で実行されますか?それ以外の場合は、複数のスレッドではなく複数のワーカーを作成してキューのスループットを向上させることはまったく悪いことではありません。スケールアウトは常に解決策です^^ – Thomas

+0

4コア。サーバあたりのシングルインスタンスが最初の目標(合計5〜7台のサーバ)でした。私は単一のインスタンスを最大限に活用しようとしていました(私は複数のインスタンスをインストールして、私が信じている同様の結果を得ることができました) – Josh

答えて

0

私はこれが本当に古いことを知っていますが、私は自分の所見を寄稿すると思っていました。

同じマシン上で複数のプロセスを実行するだけで、キュー処理のパフォーマンスが向上しています。私の場合、私はコンソールアプリケーションを使用していますが、原理は同じです。

最終的には、MaxConcurrencyという値は、サービスバスが消費するクライアントに送信するメッセージの数を最終的に制御しているためと考えられます。より多くのメッセージをプッシュしようとする前に)。

非常に単純なメッセージハンドラを使用している場合、MaxConcurrencyを論理コア数の2x/3x/4xに設定しても、容量に達する可能性は非常に低いですが、複数のメッセージの処理は、クライアントが一度に処理するよう設定されている以上に多くのメッセージをプッシュします。 MaxConcurrencyで別のプロセスを実行すると、同じマシンであっても使用可能な容量が2倍になりますが、実際にはこれ以上の電力は供給されません。

最終的に正しい構成は、キュータスクのプロセッサ使用状況プロファイルに依存します。彼らが長時間稼働していて、プロセッササイクルを通して噛み砕く傾向がある場合は、MaxConcurrencyをあまりにも大きくすると、遅くなる可能性があります。他のマシンにスケールアップするのは本当に唯一の解決策です。

キュータスクが「スパース」であり、ほとんどの時間を待っている場合は、プロセッサ内に論理コアがあるよりも高い値であるMaxConcurrencyを取得することができますいつも忙しい。

関連する問題