单独限制 ActiveMQ 中队列的磁盘存储大小
Individually limit disk storage size for queues in ActiveMQ
ActiveMQ是否可以使用KahaDB单独限制持久队列的存储大小?
我们使用这样的设置与 ActiveMQ 进行应用程序之间的数据交换:
[App1] ==> (Queue1) ==> [App2] ==> (Queue2) ==> [App3]
数据流从App1通过Q1到App2(持久),然后从App2通过Q2到App3(也是持久)。现在,当 App2 确认时,来自 Q1 的消息被删除,当 App3 确认时,来自 Q2 的消息被删除。当 App1 填满队列而 App2 不可用时,就会出现问题。然后,当它再次可用时,App2 将缓冲的消息尝试发送给 App3,但是由于一些开销,放入 Q2 的消息比放在 Q1 的消息要大,而 App2 只有在成功放入 Q1 时才 ACK 消息进入 Q2 并阻止,直到后者成为可能。因此,系统处于死锁状态,因为没有消息从 Q1 和 Q2 中取出。
现在,我们想到的解决这个问题的一个方法是单独限制队列的存储 space(例如,Q1 和 Q2 各使用 10 GB),这样一个完整的 Q1 就不会干扰使用 Q2,但我们无法配置 ActiveMQ 来执行此操作,不能使用 mKahaDB(仍然是相同的死锁)或使用生产者流控制。我们发现的几乎所有设置都用于内存,似乎不适用于磁盘存储。有没有办法实现这种分离?
虽然似乎没有配置来限制每个队列的实际磁盘存储使用,但通过对不同的队列使用不同的 storeUsageHighWaterMark
目标策略,我们可以避免死锁,因为现在总是有一些保留 space 用于第二季度。
您应该根据您的阈值待处理消息计数使用流量控制停止接受 Q1 中的消息,这样 Q2 仍然可以继续。您还可以为 Q1 和 Q2 队列使用不同的 KahaDB 文件(如果您的 activeMQ 版本支持的话)
数据库文件大小尚无可用控制。
ActiveMQ是否可以使用KahaDB单独限制持久队列的存储大小?
我们使用这样的设置与 ActiveMQ 进行应用程序之间的数据交换:
[App1] ==> (Queue1) ==> [App2] ==> (Queue2) ==> [App3]
数据流从App1通过Q1到App2(持久),然后从App2通过Q2到App3(也是持久)。现在,当 App2 确认时,来自 Q1 的消息被删除,当 App3 确认时,来自 Q2 的消息被删除。当 App1 填满队列而 App2 不可用时,就会出现问题。然后,当它再次可用时,App2 将缓冲的消息尝试发送给 App3,但是由于一些开销,放入 Q2 的消息比放在 Q1 的消息要大,而 App2 只有在成功放入 Q1 时才 ACK 消息进入 Q2 并阻止,直到后者成为可能。因此,系统处于死锁状态,因为没有消息从 Q1 和 Q2 中取出。
现在,我们想到的解决这个问题的一个方法是单独限制队列的存储 space(例如,Q1 和 Q2 各使用 10 GB),这样一个完整的 Q1 就不会干扰使用 Q2,但我们无法配置 ActiveMQ 来执行此操作,不能使用 mKahaDB(仍然是相同的死锁)或使用生产者流控制。我们发现的几乎所有设置都用于内存,似乎不适用于磁盘存储。有没有办法实现这种分离?
虽然似乎没有配置来限制每个队列的实际磁盘存储使用,但通过对不同的队列使用不同的 storeUsageHighWaterMark
目标策略,我们可以避免死锁,因为现在总是有一些保留 space 用于第二季度。
您应该根据您的阈值待处理消息计数使用流量控制停止接受 Q1 中的消息,这样 Q2 仍然可以继续。您还可以为 Q1 和 Q2 队列使用不同的 KahaDB 文件(如果您的 activeMQ 版本支持的话) 数据库文件大小尚无可用控制。