MSMQ のパフォーマンスをチェックするためにいくつかのテストを実行し、大量のメッセージを別のサービスに渡して処理するという点で、MSMQ がニーズに合っているかどうかをテストしました。私たちの要件は、一部のメッセージは重要であり、トランザクションを使用して回復可能な方法で配信する必要があり、他のメッセージはそうでないことです。
私の実験では、長さ 108 バイトのテキストの 1000 文字列を MSMQ に送信し、これを 50 回実行して平均を取得し、1000 メッセージの各バッチの最小、最大、および平均パフォーマンスを登録しました。
C++ サービスを使用して、メッセージを 2 つのローカル プライベート キュー (1 つは非トランザクション、もう 1 つは必要に応じてトランザクション) にディスパッチしています。4 つの実験を実行しました。これらは次のとおりです。
1) トランザクション送信のみ
2) 非トランザクション送信のみ
3) 1000 メッセージの各セットの 500 を非トランザクションで送信し、続いて残りの 500 をトランザクションで送信する
4) 500 件のメッセージをトランザクションで送信し、500 件を非トランザクションで送信し、トランザクションと非トランザクションを交互に送信して、各トランザクションの後に非トランザクションが続くようにする。
私は他の外的要因を排除しましたが、得られた結果はかなり奇妙です。なぜ誰かが説明できるのだろうか? 結果は次のとおりです。
1) トランザクション
Average: 1436
Min: 398
Max: 1902
2) 非トランザクション
Average: 35
Min: 30
Max: 100
3) 混合フォローオン
Average: 40
Min: 29
Max: 323
4) 混合点在
Average: 4944
Min: 1214
Max: 5941
私を混乱させる2つの問題は、最初にトランザクション送信と非トランザクション送信を交互に行うと、すべてをトランザクションで送信するよりも約5倍のパフォーマンスヒットが発生することです-すべてをトランザクションで送信すると、メッセージの半分だけを送信するよりもコストがかかると思いましたこれが行われる方法に関係なく、トランザクション的には 5 倍遅くはありません。次に、500 個の非トランザクション メッセージの後に 500 個のトランザクション メッセージを送信すると、このテストの平均送信レートがわずか 40 ミリ秒であることから判断すると、トランザクション メッセージが 1000 個の個別のトランザクションの 1 つのバッチとして送信される場合と比較して、トランザクション送信が実際に高速化されるようです。
個々のメッセージをトランザクション キューに書き込み、続いて非トランザクション キューに書き込むという交互作用は、MSMQ がシリアル化するファイルを同期的に切り替える必要があることなどによって繰り返し発生しますか?
参考までに、MSMQ に組み込まれた単一メッセージ トランザクションを使用しています。また、これらの実験を数回実行しましたが、数値は常にほぼ同じでした. また、データが正しく計算されていることも確認しました。
スイッチング キューのパフォーマンス ヒットと、トランザクション キューの前に非トランザクション キューに送信することによるパフォーマンスの向上を説明する助けをいただければ幸いです。
前もって感謝します。