2013-12-18 52 views
7

私のアプリケーションのボトルネックは、MassTransitを使用してMSMQでメッセージを送受信しています。送信と受信の両方が同じアプリケーション内で起こっていますが、メモリ内のキューを使用するにはメッセージが多すぎます。ここでMSMQからのメッセージの受信をどのように高速化できますか?

は私の単純なキューの設定です:私の実験のために

messageBus = ServiceBusFactory.New(sbc => 
       { 
        sbc.UseMsmq(); 
        sbc.VerifyMsmqConfiguration(); 
        sbc.UseMulticastSubscriptionClient(); 
        sbc.ReceiveFrom("msmq://localhost/msg_queue"); 
        sbc.Subscribe(subs => 
        { 
         subs.Handler<EventMessage>(msg => Enqueue(msg)); 
        }); 
       }); 

、MSMQは、現在〜100万件のメッセージを持っており、我々はそれに新しいメッセージをプッシュされていません。 Enqueue()でメッセージを送信する時間以外の作業は行っていません。

この情報を使用すると、ネットワークの待ち時間がない場合でも、少なくとも1000件のメッセージが表示されることを期待したときに、MSMQから毎秒150〜200件のメッセージしか取得できません。各メッセージは< 2kbです。

キューでメッセージの順序を維持しながら、MSMQがMassTransitを介してアプリケーションにメッセージをどのくらい迅速に渡すかをスピードアップできますか?

+0

あなたはすでにこれを経験しているかもしれませんが、[ここをクリック](http://support.microsoft.com/kb/199​​428)。私たちはWebsphere MQを使用して、おそらくMSMQで今何を得ているのかを知ることができます。 –

+0

あなたの1,000メッセージ/秒の希望は何に基づいていますか? –

+0

現在、未処理のメッセージが100万個*のバックログを持っていて、奇跡を期待していない場合、それらのデータストアは相当なものです。 MSMQは、毎秒何千ものメッセージを処理するのに問題はありません。キューブをパージして合理的な出発点に戻すのは、これまでのところ悪いことでした。 –

答えて

1

私はこれまでと同様に対処しました。私が正しく覚えていれば、 メッセージの有効期限をTimeToBeReceivedで指定しました(送信されたメッセージが宛先キューから受信される合計時間。デフォルトはInfiniteTimeoutです)。このmsdn linkを参照してください。

+0

あなたの処理が十分に速くない場合、これは期限切れのメッセージではありませんか?毎秒200個のメッセージしか処理できない場合、800個以上のメッセージを削除すると、1秒あたり1000個のメッセージが処理されるとは思われません。私はこの構成で何かを逃していますか? – Chris

+0

@Chris、私はあなたと一緒です。しかし、私のシステム(切断されたシステム)では、2つの戦略に基づいてメッセージやコールバックを無視します。 (a)TimeToBeReceived(b)メッセージと共にカスタムタイムスタンプ。これらの要因を利用して、キュー内のバックログが少ない最新のメッセージを処理することができました。バックログを消去する優れたメカニズムがあれば、毎秒500-1000件のメッセージを処理できます。 – Nair

関連する問題