2011-10-14 74 views
0

我需要發佈大量的[僅標頭]消息,每個消息都屬於唯一類別。考慮:ActiveMQ主題內存使用

A.B.C.D.E.F 

理想情況下,除了所有其他的考慮,我想發佈每個消息在自己的主題,但這可能會導致成千上萬的話題。好處是一個非常簡單的基於通配符的訂戶模型。我只是不確定單個主題的基準內存使用情況以及數千個主題的總體使用情況。

對於調整,主題將是非持久性和非持久性的。如果可能的話,我還可以將消息數量限制爲1,同時丟棄較舊的消息。消息將每隔n秒(通常> 15s)以波形發佈。這將減少內存使用量。

我的選擇是對發佈基於第一2段如主題:

A·B

,並把該段的其餘部分鍵頭。然後,訂閱者必須使用主題通配符和選擇器的組合來訂閱其期望的訂閱源。

任何人都有這方面的見解?

謝謝!

//尼古拉斯

+1

你有沒有考慮過使用Camel來實現這個邏輯......看起來很合適 –

回答

0

我設置了一個測試來測量主題的實際內存消耗。簡而言之:

  1. 我開始一個包含主題基數的循環,這些主題是通過JMS會話實時創建的。
  2. 在內部循環中,我調用System.gc(),然後測量使用的堆空間。這10秒鐘完成10次。在每個內部循環結束時暫停。
  3. 我計算內循環中採樣的平均堆用量。
  4. 我增加主題的基數乘以100

結果是這樣的:

enter image description here

綜上所述,消耗了大約29.5的堆空間KB每個主題。請注意,我沒有花費太多精力來調整主題的目標政策,這可能會有所減少。總體而言,我不認爲這是壞事,但我不認爲它會縮放到我想要的數字,所以我採用了不同的方法使用駱駝(如boday所示)。

基本上,當客戶訂閱使用主題通配符時,我正在緩存模式。當Camel消費者收到[非jms]消息時,它會檢查緩存,並且如果消息與緩存中的任何通配符條目匹配,它將發佈到相應的主題(將被動態創建)。一旦主題停止接收發布(因爲高速緩存有一個匹配的通配符被刪除),主題將超時並被「GC'ed」。

工作得很好。

//尼古拉斯