Memory ActiveMQ-已达到主题(镜像队列)的内存限制
我们正在使用具有以下配置的ActiveMQ 5.6: -上的流量控制 -主题1MB的内存限制 -已启用镜像队列(未定义显式虚拟主题) 有持久消息被发送到队列Memory ActiveMQ-已达到主题(镜像队列)的内存限制,memory,persistence,activemq,jms-topic,flooding,Memory,Persistence,Activemq,Jms Topic,Flooding,我们正在使用具有以下配置的ActiveMQ 5.6: -上的流量控制 -主题1MB的内存限制 -已启用镜像队列(未定义显式虚拟主题) 有持久消息被发送到队列QueueA。显然,此消息被复制到Mirror.QueueA,这是一个非持久性的自动创建主题 在这个话题上,没有消费者。如果偶尔有消费者,则他们是非持久订户 一段时间后,生产者阻塞,我们得到以下错误: Usage Manager memory limit reached for topic://Mirror.QueueA 根据include
QueueA
。显然,此消息被复制到Mirror.QueueA
,这是一个非持久性的自动创建主题
在这个话题上,没有消费者。如果偶尔有消费者,则他们是非持久订户
一段时间后,生产者阻塞,我们得到以下错误:
Usage Manager memory limit reached for topic://Mirror.QueueA
根据include,主题中没有持久订阅者的消息将被删除,这是我想要的,也是我所期望的。但情况显然并非如此
但公认的解决方案建议使用流控制,但禁用磁盘假脱机:
这将不会使用磁盘,并在命中MemoryLit时阻止生产者
但我不想阻止生产商,因为他们会无限期地阻止,因为没有消费者到来。为什么要持久化这些消息
我看到的选择很少:
-这是一个bug,可能在以后的AMQ版本中已修复
-这是一个配置问题(我不知道如何解决)
-有一些选项可以在达到内存限制时简单地删除最旧的消息(我找不到任何这样的选项)
我希望有人能帮忙
谢谢
//J
[更新]
虽然我们已经在现场部署了5.6版本,但我目前正在使用相同的配置在5.8安装的AMQ上运行相同的耐久性/负载测试。现在,我已经在5.6系统上传输了10倍的消息,没有任何问题。我会让这个测试运行一个晚上甚至几天,看看是否有其他限制。好的
正如之前的更新中所述,我在ActiveMQ的5.8安装上运行了相同的laod测试,配置与导致存储超出的配置相同
这是在大约将450个事务发送到主题内存限制为1MB的3个队列之后发生的。您甚至可以看到KahaDB数据库文件的大小在增长
使用AMQ5.8,我在4天后停止了负载测试,导致发送了大约280.000个事务。没有存储问题,没有卡死生产者,KahaDB文件始终保持大致相同的大小
因此,尽管我不能肯定这是ActiveMQ 5.6中的一个bug,但5.8的行为显然不同,正如预期和记录的那样。当没有注册订户时,它不会将消息持久地存储在镜像队列中
对于AMQ5.6的现有安装,我们使用了一些技巧来避免更改应用程序代码
- 由于应用程序使用的是前缀为“Mirror.”(默认前缀)的主题和一些通配符,因此我们只需在启动时使用
XML标记在配置中定义一个主题。在使用通配符的地方,我们只使用了硬编码名称,如
。不幸的是,下一步需要这样做:all device
- 我们在配置的
部分中定义了一个
,它将所有消息(
)的副本从实际(镜像)队列路由到一个主题。此主题需要提前定义或手动创建,因为简单地定义
也不会创建主题。另外,您不能使用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>
希望这有帮助。这种“黑客”可能不可能在每种情况下都出现,但因为我们从未在个别镜像主题上花费精力,所以这是可能的