処理が必要な約10個のキューにデータをスローするワーカーロールが1つあります。大量のデータがあります。おそらく、1秒間に約10〜100のメッセージが、さまざまなキューにキューイングされます。
キューは異なるデータを保持し、それらを別々に処理します。特に非常にアクティブな単一のキューがあります。
私が今設定している方法では、10個の異なるスレッドを生成する個別のワーカーロールがあり、各スレッドはwhile(true){キューからメッセージを取得して処理する}を持つメソッドを実行します。キュー内のデータがバックアップされるたびに、これらのプロセスをさらに起動するだけで、キューからのデータの処理を高速化できます。また、1つのキューがよりアクティブであるため、実際には、同じメソッドを指す多数のスレッドを起動して、そのキューからのデータを処理します。
ただし、展開のCPU使用率が高いことがわかります。ほぼ100%またはほぼ常に。
これはスレッドの枯渇によるものなのだろうか?または、キューへのアクセスがRESTfulであり、接続を実行して処理速度を低下させることにより、スレッドが相互にブロックすることになりますか?または、私が使用しているためですか?
while(true)
{
var message = get message from queue;
if(message != null)
{
//process message
}
}
そして、それはあまりにも速く実行されますか?
メッセージを処理するたびに、メッセージはAzure Table StorageまたはDBにも保存されるため、CPUを消費しているのはこのデータを保存するプロセスである可能性があります。
事実上、高いCPU負荷をデバッグすることは非常に困難でした。ですから、私の質問は次のとおりです。発生する可能性のある問題を軽減および防止するのに役立つ、一般的なアーキテクチャの変更はありますか?(たとえば、while(true)を使用して別のタイプのポーリングを使用する代わりに、この例では最終的に同じだと思いますが)。
たぶん、単にnew Thread()を使用して新しいスレッドを生成することは、最善の方法ではありません。