2013-03-25 33 views
0

您能解釋一下,使用可恢復消息時將使用多少RAM內存? 我知道,一條消息大約消耗70-80字節,這是好的,我知道郵件正文將保存到磁盤,但它是否也可以將正文複製到RAM中? 我試圖用express和可恢復的消息(消息存儲限制爲1GB)來測試 - 並且在這兩種情況下,我都會在進程資源管理器中看到,msmq服務進程已將其工作集(內存)達到1GB。我明白,如果是快遞郵件,這沒什麼問題,但有了可恢復的郵件,郵件就會少得多!使用問題的MSMQ

而第二個問題是關於MSMQ回調限制。

如果您收到帶回調的郵件,請考慮每個進程只能登錄到最多63個回調函數 。如果您的回調無限期地等待隊列 ,您可能會達到此限制。

它適用於所有隊列還是隻適用於一個隊列?例如,我有我的過程,我做類似:

QueueFirst = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() }; 
QueueFirst.ReceiveCompleted += QueueOnReceiveCompleted; 
QueueSecond = new MessageQueue(@".\test") { Formatter = new BinaryMessageFormatter() }; 
QueueSecond.ReceiveCompleted += QueueOnReceiveCompleted; 
for (int i = 0; i < 63; i++) 
{ 
    QueueFirst.BeginReceive(TimeSpan.FromSeconds(10), "", Callback); 
    QueueSecond.BeginReceive(TimeSpan.FromSeconds(10), "", Callback); 
} 

我可以這樣做嗎?我在問,因爲如果我將上限週期限制爲超過63的值,則不會發生任何錯誤。我使用這個method overload,因爲在幫助中有關於回調的東西,是否意味着使用事件處理程序沒有任何限制?

+0

你爲什麼看着工作組? http://getgreenshot.org/2010/07/24/a-few-words-on-memory-usage-or-working-set-vs-private-working-set/ – 2013-03-25 11:13:38

回答

1

MSMQ將消息存儲在內存中,如果它可以提高性能。
消息也寫入所有類型的磁盤 - 快速/可恢復/事務。
消息的大小對於確定RAM使用情況並不重要。
This blog應該具備瞭解消息如何使用內存所需的一切。
This blog也是有用的。

+0

謝謝,約翰,我讀過你的博客帖子反覆(尤其是本文),但我仍然有疑問 - 如果我有很多msmq消息(當然他們處理,但無論如何推動比彈出更快),可以消息吃我所有的RAM?限制RAM使用並設置較大的磁盤限制將會很酷。 關於線程的問題 - 它是否只涉及隊列的63個異步處理程序,或者是否涉及所有本地隊列的63個異步處理程序?因爲有關於回調的討論,也許它只發生在帶有AsyncCallback的構造函數中,而不是ReceiveCompleted事件? – Boo 2013-03-25 12:48:26

+0

MSMQ(在Windows 2000之後)將只使用它認爲可以安全使用的消息體的內存。如果空閒內存不足,則消息將留在磁盤上以便按需讀取。基本上MSMQ是自我限制的(或者,更確切地說,受操作系統限制)。 – 2013-04-03 08:20:48

+0

本文(http://support.microsoft.com/default.aspx?scid=kb;EN-US;901279)表示每個系統63個異步處理程序,而不是每個隊列。 – 2013-04-03 08:25:00