【问题标题】:ActiveMQ Topic Memory UsageActiveMQ 主题内存使用
【发布时间】:2011-12-07 17:44:47
【问题描述】:

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

A.B.C.D.E.F

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

对于调优,主题将是非持久性和非持久性的。如果可能的话,我还可以一次将消息数量限制为 1 条,这样旧的消息就会被丢弃。消息将每隔 n 秒(通常 > 15 秒)以波的形式发布。这将减少内存使用量。

我的替代方法是根据前两个部分发布到主题,例如:

A.B

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

有人对此有任何见解吗?

谢谢!

//尼古拉斯

【问题讨论】:

  • 你有没有考虑过使用 Camel 来实现这个逻辑……看起来很合适

标签: memory activemq publish-subscribe


【解决方案1】:

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

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

结果如下所示:

总的来说,每个主题消耗了大约 29.5 KB 的堆空间。请注意,我没有花费太多精力来调整主题的目标策略,这可能会在一定程度上减少这种情况。

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

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

效果很好。

//尼古拉斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多