2012-03-26 31 views
1

我有一個客戶端服務器應用程序利用MSMQ和NServiceBus進行消息傳遞。在最近的一些測試,客戶留停用一段時間,MSMQ的意外行爲被發現:MSMQ QMThreadNo和CleanupInterval

  • MSMQ具有線程的默認數量,使用它來處理隊列 (在註冊表中設置爲QMThreadNo)。當隊列長時間處於休眠狀態 時,它們會累積大量的消息。這些大隊列保留了MSMQ比平時有限的 線程的數量,因此需要更長的時間處理實際處於活動狀態的隊列 。
    • 可以將註冊表項設置爲更高的線程數。
  • 客戶端未發送/接收消息的 時間(在註冊表作爲CleanupInterval設置)的一組週期將變爲 「無效」狀態,並最終他們的隊列將直到 消息被刪除從該客戶端發送,迫使隊列的重新創建。
    • CleanupInterval可以從其默認值5分鐘更改爲更長的時間。

有沒有人遇到過這些問題?如果是這樣,那裏有什麼可能的解決方案?

回答

1

您需要區分傳出隊列或目標隊列。

「當隊列被留在一個休眠狀態的 長時間,他們積累了大量的信息。這些大隊列 不放有限數量的線程該MSMQ具有長於 通常因此確實需要更長的時間來處理 實際處於活動狀態的隊列。「

MSMQ具有用於傳出隊列的線程池。 MSMQ將嘗試將傳出隊列連接到目標並傳遞消息。例如,如果您有1000個傳出隊列,那麼MSMQ需要一段時間才能遍歷所有隊列。 這與目標隊列無關。

我不太明白傳出隊列中的消息數量將如何影響線程使用率。每次只有一個線程在特定隊列中使用。

活動隊列有一個線程 - 否則它不會被激活。我假設我們在這裏談論計算機管理隊列的狀態。

客戶端未發送/接收消息的 時間(在註冊表作爲CleanupInterval設置)的一組週期將變爲 「無效」狀態,並最終它們的隊列將被刪除,直到 消息是從該客戶端發送,迫使隊列的娛樂休閒。

再一次,這只是外出隊列。出站隊列由MSMQ按需動態創建。在CleanupInterval之後,它們將被刪除(如果爲空)。這非常正常,MSMQ如何釋放資源。

與任何產品一樣,MSMQ可能需要進行優化以滿足您的需求。如果您想更改註冊表值,請繼續。

乾杯
John Breakwell

+0

*謝謝你的回覆John。 要清除任何歧義,我們有一個部分連接的客戶端/服務器應用程序,需要實時消息。我們已經在你的一些文章中讀到過,MSMQ最初不是爲實時設計的,但可以配置爲這樣做。 我們的問題是客戶端上的傳出隊列被設置爲「已連接」。然而,服務器上的傳出隊列被設置爲「未激活」長達30分鐘,這對於我們的「實時」系統是低效的。經過這段時間後,服務器上的傳出隊列被重新設置爲「已連接」,並且消息再次正常流動。 – absentees 2012-03-29 03:03:46

+0

我們已將QMThreadNo修改爲3000,但尚未發現從非活動狀態變爲連接狀態的變化。我們也將WaitTime修改爲5000,希望它能減少處理不同線程之間的時間。 – absentees 2012-03-29 03:07:30

+0

所以你已經證明它不是一個線程問題。除非你有很多很多傳出隊列,否則我不會指望它是無論如何。 – 2012-03-29 10:48:36