1

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

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

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

过了一会儿,生产者阻塞了,我们得到以下错误:

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

根据包括ActiveMQ 文档在内的各种来源,没有持久订阅者的主题中的消息将被丢弃,这是我想要的和预期的。但显然情况并非如此。

一个相关的 StackOverflow 问题,但公认的解决方案建议使用流控制但禁用磁盘假脱机:

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

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

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

我希望有人能帮帮忙!

谢谢,

//J

[更新]

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

4

1 回答 1

2

好的,

如之前更新中所述,我在 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. 不幸的是,下一步需要这样做:
  • <compositeQueue>我们在配置部分中定义了一个<destinationInterceptors>,它将所有消息的副本(<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>

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

于 2014-06-23T11:46:20.867 回答