单独限制ActiveMQ中队列的磁盘存储大小

时间:2015-08-20 08:13:52

标签: activemq

使用KahaDB的ActiveMQ是否可以单独限制持久队列的存储大小?

我们正在使用ActiveMQ这样的设置在应用程序之间进行数据交换:

[App1] ==> (Queue1) ==> [App2] ==> (Queue2) ==> [App3]

数据流通过Q1(持久)从App1到App2,然后通过Q2从App2到App3(也是持久的)。现在,当App2确认它们时,来自Q1的消息将被删除,从App3开始的Q2开始。当App2不可用时,App1填满队列时会出现问题。然后,当它再次可用时,App2接收缓冲的消息并尝试将它们发送到App3,但是由于一些开销,放入Q2的消息大于Q1上的消息,并且App2仅在Q1成功放置时确认消息进入Q2并阻塞,直到后者成为可能。因此,系统处于死锁状态,因为没有消息从Q1和Q2中取出。

现在,我们想到的一个解决这个问题的方法是单独限制队列的存储空间(例如Q1和Q2每个使用10 GB),这样一个完整的Q1不会干扰Q2,但我们是无法配置ActiveMQ来执行此操作,而不能使用mKahaDB(仍然是相同的死锁)或使用Producer Flow Control。我们发现的几乎所有设置都用于内存,似乎不适用于磁盘存储。有没有办法实现这种分离?

2 个答案:

答案 0 :(得分:0)

虽然似乎不存在限制每个队列的实际磁盘存储使用的配置,但通过对不同的队列使用不同的storeUsageHighWaterMark目标策略,我们可以避免死锁,因为现在总是有一些用于Q2的保留空间

答案 1 :(得分:0)

您应该使用flowcontrol根据阈值待处理消息计数停止接收Q1中的消息,这样Q2仍然可以继续。您还可以为队列Q1和Q2使用不同的KahaDB文件(如果您的activeMQ版本支持它) DB文件大小上没有可用的控件。