2013-01-02 17 views
0

我們在我們的Web應用程序中使用NServiceBus,並且最近發現有時會出現一些消息,即使連接狀態也只是坐在出站隊列中,但是永遠不會離開。刪除它們的最快解決方案是重新啓動MSMQ服務。我遇到的一個問題是,當重新啓動或停止MSMQ服務時,CPU跳轉到100%。NServiceBus停止MSMQ時100%的CPU使用率

有沒有人遇到這個,並找到一種方法來防止這種高負荷。我不喜歡因停止服務而停機的想法?我知道的一種方式是使用僅發送模式,但這並不理想。

UPDATE:在Global.asax應用程序中使用 配置代碼開始:

IBus bus = Configure 
      .With() 
      .DefaultBuilder() 
      .FileShareDataBus("c:\\storage") 
      .XmlSerializer() 
      .MsmqTransport() 
      .IsTransactional(false) 
      .PurgeOnStartup(false) 
      .UnicastBus() 
      .ImpersonateSender(false) 
      .CreateBus() 
      .Start(() => Configure.Instance.ForInstallationOn<Windows>().Install()); 
+0

您使用的是什麼版本的nsb? –

+0

我正在使用nsb 3.3.0。我另外更新了這個問題以添加配置代碼。 – Ryan

回答

0

我覺得你的問題可能涉及到其關閉GitHub上的問題Incorrect MSMQ perms cause high CPU in web application,但針對4.0版本是尚未出來。

問題是NServiceBus試圖從隊列中讀取,但沒有隊列!所以它進入了一個緊密的Check-Error-Retry循環,它固定了處理器。

取消MSMQ對於需要它的Web服務器來說是一件相當惱怒的事情。如果您需要在生產環境中執行此操作,我建議將服務器從負載平衡池中取出(我假設/希望您正在使用負載平衡器),然後重新啓動MSMQ,然後重新啓動IIS。如果服務器沒有處理請求,那麼短時間的高CPU活動應該不是什麼大問題。

當4.0出來時它應該照顧CPU的問題,但我仍然建議讓服務器停止旋轉,否則Bus.Send()將拋出,而MSMQ不可用。

+0

謝謝你。這不是權限,我不幸在發佈前幾周遇到了這些問題,而且我花了一段時間才解決了這個問題。這絕不是重新啓動或停止MSMQ服務的目標,但它是我們認爲應該迎合而不是僅僅在地毯下掃蕩的事情之一。很高興看到有些事情正在處理中。爲此歡呼! – Ryan