【问题标题】:ActiveMQ - Memory limit reached for topic (Mirror Queue)ActiveMQ - 达到主题的内存限制(镜像队列)
【发布时间】:2014-08-08 20:02:13
【问题描述】:

我们正在使用具有以下配置的 ActiveMQ 5.6: - 流量控制开启 - 主题的内存限制 1MB - 启用镜像队列(未定义明确的虚拟主题)

有持久消息被发送到队列QueueA。显然,这条消息被复制到Mirror.QueueA,这是一个非持久性的自动创建的主题。

在这个话题上,没有消费者。如果偶尔有消费者,他们就是非持久订阅者。

一段时间后,生产者阻塞,我们得到以下错误:

Usage Manager memory limit reached for topic://Mirror.QueueA

根据various sources 包括ActiveMQ documentation,没有持久订阅者的主题中的消息将被丢弃,这是我想要的和预期的。但显然情况并非如此。

one related StackOverflow question,但公认的解决方案建议使用流量控制但禁用磁盘假脱机:

当达到 memoryLimit 时,不会使用磁盘和块生产者。

但我不想阻止生产者,因为他们会无限期地阻止,因为没有消费者来。为什么要保留这些消息?

我看到几个选项: - 这是一个错误,可能会在以后的 AMQ 版本中修复 - 这是一些配置问题(我不知道如何解决) - 有一些选项可以在达到内存限制时简单地删除最旧的消息(我找不到任何这样的选项)

希望有人能帮忙!

谢谢,

//J

[更新]

虽然我们已经在现场部署了 5.6 版本,但我目前正在以相同配置在 5.8 安装的 AMQ 上运行相同的耐久性/负载测试。现在,我已经传送了 10 倍于 5.6 系统的消息,没有任何问题。我会让这个测试在晚上甚至接下来的几天里运行,看看是否还有其他限制。

【问题讨论】:

    标签: memory persistence activemq jms-topic flooding


    【解决方案1】:

    好的,

    如之前更新中所述,我在 ActiveMQ 的 5.8 安装上运行相同的 laod 测试,使用相同的配置导致存储超出。

    这是在将大约 450 个事务发送到 3 个队列(主题内存限制为 1MB)之后发生的。您甚至可以看到 KahaDB 数据库文件的大小不断增长。

    使用 AMQ 5.8,我在 4 天后停止了负载测试,导致发送了大约 280.000 个事务。没有存储问题,没有卡住的生产者,并且 KahaDB 文件始终保持大致相同的大小。

    所以,虽然我不能肯定这是 ActiveMQ 5.6 中的一个错误,但 5.8 显然表现不同,并且符合预期和记录。当没有订阅者注册时,它不会将消息永久存储在镜像队列中。

    对于 AMQ 5.6 的现有安装,我们使用了一些技巧来避免更改应用程序代码。

    • 因为应用程序正在使用前缀为“Mirror”的主题。 (默认前缀)和一些通配符,我们只是在配置启动时使用<destinations> XML 标记定义了一个主题。在使用通配符的地方,我们只使用了硬编码的名称,例如all-device。不幸的是,下一步需要这样做:
    • 我们在配置的<destinationInterceptors> 部分中定义了<compositeQueue>,它将来自实际(镜像)队列的所有消息(<forwardTo>)的副本路由到一个主题。该主题需要提前定义或手动创建,因为仅定义compositeQueue 不会同时创建主题。另外,你不能使用
    • 然后我们从配置中删除了镜像队列功能

    总结起来有点像这样:

        <destinations>
            <topic name="Mirror.QueueA.all-devices" physicalName="Mirror.all-devices" />
        </destinations>
    
        <destinationInterceptors>
          <virtualDestinationInterceptor>
            <virtualDestinations>
              <compositeQueue name="QueueA.*" forwardOnly="false">
                <forwardTo>
                  <topic physicalName="Mirror.QueueA.all-devices" />
                </forwardTo>
              </compositeQueue>
            </virtualDestinations>
          </virtualDestinationInterceptor>
        </destinationInterceptors>
    

    希望这会有所帮助。这种“破解”可能并非在所有情况下都是可能的,但由于我们从未在单个 Mirror 主题上消费过,所以这是可能的。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2021-12-28
      • 2014-02-09
      • 2014-07-03
      • 2011-12-07
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多