0

データが1つのキューにプッシュされるMSMQアプリケーションのセットアップがありました。最初は、それを読み取って処理するプロセスは1つしかありませんでした。ボリュームが増えたので、それから読み取るために複数のプロセスを開始しました。これは基本的に元のプロセスの新しいインスタンスです。エラーは表示されませんが、パフォーマンスは実際に低下しています。私の理解では、各プロセスはキューから読み取り、まだ処理されていない新しいメッセージを受信して​​続行します。これは正しいですか、それとも複数のプロセスが同じメッセージを処理してしまう可能性がありますか?

    Dim q As MessageQueue
    If MessageQueue.Exists(".\private$\MsgsIQueue") Then
        q = New MessageQueue(".\private$\MsgsIQueue")
    Else
        'GS - If there is no queue then we're done here
        Console.WriteLine("Queue has not been created!")
        Return
    End If

     While True
            Dim message As Message
            counter += 1
           Try
                If q.Transactional = True Then
                    Thread.Sleep(2000)
                End If
                q.MessageReadPropertyFilter.ArrivedTime = True
                message = q.Peek(TimeSpan.FromSeconds(20.0))
                message.UseJournalQueue = True
                message = q.Receive(New TimeSpan(0, 0, 60))
                message.Formatter = New XmlMessageFormatter
                                   (New [String]() {"System.String"})
                ProcessMessage(message)
                ....
4

1 に答える 1

2

わかりました、実際にパフォーマンスの低下を引き起こしているのはキューの読み取りであると確信していますか? MSMQ は複数のプロセス/スレッドからの読み取りの処理に非常に優れているため、パイプラインに他のボトルネックがあると思われます。

あなたのコードを見ると、次の変更を提案します。

  • tx キューの場合、なぜ 2 秒間スリープするのですか? 常に tx キューを使用し、スリープへの呼び出しを catch ブロックに移動して、キューが空の場合に待機間隔を設けます。

  • フィルターの設定をループの外に移動します。

  • Peek の呼び出しは価値がないため削除します。

  • ジャーナル キューの使用は、メッセージの送信時にのみ使用されます。だからそれを削除します。

  • 代わりにフォーマッターをキューに設定すると、すべての読み取りに使用されます。

また、別の try/catch ブロックで ProcessMessage をラップする TransactionScope 内で Read および ProcessMessage への呼び出しをラップする必要もあります。このようにして、ProcessMessage ですべてが OK になった場合に読み取りをコミットするか、そうでない場合は読み取りを中止するか、メッセージをデッド レター キューに移動することを選択できます。

于 2013-02-12T23:14:27.497 に答える