2013-12-18 64 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目前擁有約1萬條消息,我們不推任何新的消息了。我們在Enqueue()中沒有做任何工作,除了發送消息的速度有多快外。根據這些信息,我們只能從MSMQ獲得每秒150到200條消息,當我希望在沒有網絡延遲的情況下,每秒至少有1000條消息。每條消息是< 2kb。

我們應該如何加快MSMQ通過MassTransit將消息傳遞到應用程序的速度,同時保持消息順序由隊列強制執行?

+0

您可能已經通過這個,但有一個[看這裏](http://support.microsoft.com/kb/199​​428)。我們使用Websphere MQ並可能瞭解您現在正在使用MSMQ獲得的信息。 –

+0

您的1,000條消息/秒希望是基於什麼? –

+0

如果你目前有一百萬*未處理的消息積壓,那麼不要期待奇蹟,他們的數據存儲是巨大的。 MSMQ每秒處理數千條消息毫無困難。這在一段時間以前很糟糕,最好是清除隊列以恢復到合理的起點。 –

回答

1

我曾經處理過類似的事情。如果我正確記得, 我們通過TimeToBeReceived指定了消息過期(從目標隊列接收發送的消息的總時間,缺省值爲無限超時。)。請參閱此msdn link

+0

如果你的處理速度不夠快,這不就是過期的消息嗎?如果你每秒只能處理200條消息,我不認爲刪除800條消息符合每秒處理1000條的條件。我是否錯過了這個配置? – Chris

+0

@克里斯,我與你同在。但是,在我的系統(斷開連接的系統)中,我們忽略基於兩種策略的消息或被調用的backogs。 (a)TimeToBeReceived(b)自定義時間戳和消息。利用這些因素,我們能夠處理最新的消息,減少隊列中的積壓。請記住,如果您有更好的機制清理積壓,則每秒處理500-1000條消息是可以實現的。 – Nair