ActiveMQ主题内存使用情况

时间:2011-10-14 12:41:07

标签: memory activemq publish-subscribe

我需要发布大量[仅标题]消息,每个消息都属于一个唯一的类别。考虑:

A.B.C.D.E.F

理想情况下,除了所有其他考虑之外,我想在每个主题上发布每个消息,但这可能会产生数千个主题。好处是一个非常简单的基于通配符的订户模型。我只是不确定单个主题的基线内存使用情况以及数千个主题的总使用情况。

对于调整,主题将是非持久且非持久的。如果可能的话,我还可以一次将消息数量限制为1,其中将删除较旧的消息。消息将每隔 n 秒(通常> 15秒)以波形发布。这样可以减少内存使用量。

我的另一种方法是根据前两个部分发布主题,如:

A·B

并将其余的段放入键控标题中。然后,订阅者必须使用主题通配符和选择器的组合来订阅他们想要的订阅源。

有人对此有任何见解吗?

谢谢!

//尼古拉斯

1 个答案:

答案 0 :(得分:0)

我设置了一个测试来测量主题的实际内存消耗。简而言之:

  1. 我启动了一个循环,其中包含基本数量的主题,通过JMS会话即时创建。
  2. 在内部循环中,我调用System.gc()然后测量使用的堆空间。这是在10秒内完成10次。在每个内循环结束时暂停。
  3. 我计算内循环中采样的平均堆使用量。
  4. 我将主题的基数增加100。
  5. 结果如下:

    enter image description here

    总之,每个主题消耗了大约29.5 KB的堆空间。请注意,我没有花费太多精力来调整主题的目标政策,这可能会减少这一点。

    总的来说,我不认为这很糟糕,但我认为它不会扩展到我想要的数字,所以我采用不同的方法使用Camel(正如boday所建议的那样)

    基本上,当客户端使用主题通配符订阅时,我正在缓存该模式。当Camel使用者收到[non-jms]消息时,它会检查缓存,如果该消息与缓存中的任何通配符条目匹配,它将发布到相应的主题(将动态创建)。一旦主题停止接收发布(因为缓存已删除匹配的通配符),该主题将超时并被“GC”化。

    工作得很好。

    //尼古拉斯