【问题标题】:ActiveMQ message group expirationActiveMQ 消息组过期
【发布时间】:2015-12-16 16:33:39
【问题描述】:

我们在 ActiveMQ 中使用消息组。

我们每天将有大约 100,000 个消息组,每个组有 1 到 10 条消息。该组的随机(1 到 10 条)消息将在大约 24 小时内在未知时间到达。

由于我们不知道特定消息组将有多少消息到达,因此我们无法明确关闭该组。不过,我们不希望消息组永远存在,因为我们怀疑这会是内存泄漏。

我们如何才能实现类似于以下的效果?有没有我们缺少的替代方案?

messageGroup.setTimeToLive(48 小时)?

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    您无需担心关闭消息组;作为消息组,不会根据 JMSXGroupID 的不同值单独管理消息组。 ActiveMQ为每个消息组值创建哈希码桶(即JMSXGroupID值的每个值被哈希并划分为桶。因此为JMSXGroupID的字符串值计算哈希码,然后将该值放入'哈希桶' 这样就不会有大量可能的值来避免内存耗尽。

    所以 JMSXGroupID 值可以是一个完全随机的字符串,并且代理不会耗尽 RAM。不过,我们应该更新Message Groups documentation 以更清楚地说明这一点!

    【讨论】:

    • 谢谢詹姆斯!假设我们在 2015 年 12 月 15 日创建了 AA1234597 的 NMSXGroupID。一个月后 ActiveMQ 会记得分配给 AA1234597 的消费者吗? (假设消息组从未显式关闭且消费者仍在运行)?
    • 是的;如果代理和消费者继续运行,同一个消费者线程将获取 JMSXGroupID / NMSXGroupID 值的所有消息
    • 我想我明白了。用我自己的话来说:每个消息组 id 都会被散列到一个有限的可能代码列表中。然后将 Tcode 分配给消费者
    • 正如我在doc link 中读到的,这不是默认行为,需要为队列配置messageGroupHashBucked。有没有办法从 Java 客户端配置messageGroupHashBucked,可能是在创建队列时或通过任何其他方式?需要在代理服务器中配置它会增加一个操作步骤。
    • 对于来自 google 的搜索者,我可以确认 messageGroupHashBucking 是/不再是处理消息组的默认方式。它原本是,但在某一时刻被悄悄地改变了。不知道这一点让我们的团队非常头疼,因为我们的消息组即将到期,我们不知道为什么。
    猜你喜欢
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多