2012-10-26 28 views
1

我正在使用RabbitMQ處理應用程序日誌(Windows Server 2008安裝)。應用程序向交易所發送消息。我有一個專用的隊列,可以將消息轉發給它。然後我有一個連接到該隊列的窗口服務,關閉消息,並將它們保存到數據庫。我有n個客戶端實時連接到交換機,以鎖定流,因此一次有n個連接。這些客戶端中的一些可能不能在代碼中關閉()他們的連接。許多客戶有很長時間的連接。RabbitMQ內存使用情況正在蔓延並阻止呼叫...爲什麼?

當消息從隊列中拉出時,它們被自動確認,所以我在隊列中沒有任何未確認的消息。但是,我看到兔子的記憶會隨着時間而增長。首次打開時,它從32K左右開始,然後逐漸增加,直到超過閾值並阻止傳入連接。

我有.NET和Java客戶端 - 但都是自動確認。

閱讀文檔,我沒有看到兔子如何使用記憶的任何描述 - 我不明白爲什麼隨着時間的推移記憶會變得越來越膨脹。這些消息越來越被拖垮,在我看來,這意味着Rabbit不會再堅持使用它,從而釋放相關的內存,從而導致穩定的mem使用情況。

我不明白如何擺弄Rabbit中的內存撥號將有助於 - 使用只是隨着時間的推移向上爬行:最終我會超過它。

我的猜測是我的客戶在做錯事情導致內存隨着時間的推移而增長,但我想不出爲什麼會這樣。

why does Rabbit memory usage creep up when no messages are kept on any queues? 

what coding practices could cause the RabbitMQ server to 
retain (and grow) memory? 

回答

1

是否有可能有其他隊列綁定到交易所?檢查交換下的Rabbit admin頁面,點擊你的交易所,並檢查綁定的隊列。這可能是因爲你的一個客戶在聲明交換時無意中將一個未命名的(系統隨機命名的)隊列綁定到交換機上,並且消息堆積在那裏。

另一件要檢查的是QoS設置 - 如果您將QoS設置爲默認值(無限),則Rabbit將立即向任何客戶端發送消息,而不管他們已經擁有多少消息。這導致了很多簿記,比如哪個客戶端在服務器上有哪些消息,以及客戶端上有一個大緩衝區。

請確保將您的QoS預取限制設置爲更合理的方式,比如說100。這樣,如果您有1M個消息,並且只有1個預取爲100的客戶端,則Rabbit將只向客戶端發送100個消息將其他999900保存在服務器上的磁盤上,而不是使用幾乎相同的內存。

這是我的應用程序內存膨脹的一個重要原因,現在我已經解決了預取,一切都很好。

+0

@ metaforge:謝謝你的建議。不,這沒有發生。 –