ActiveMQ KahaDB持久性存储已满



我使用ActiveMQ 5.4与KahaDB作为消息存储。在将消息(持久性为true)发布到具有持久订阅者的主题时,即使消息被分派到订阅者,持久性存储也在增加。这就导致了一个问题,因为消息存储已经满了,不能再接受任何消息了。

所以我的问题是为什么持久化存储不丢弃KahaDB中的消息,即使消息正在被调度?

问候,

您所看到的是ActiveMQ消息存储行为与主题持久订阅行为之间的交互。

当您有持久订阅时,主题被视为每个订阅者的clientId(在Connection上设置)的队列。其逻辑是客户端不希望在断开连接时错过任何消息。因此,如果它们断开连接,持久订阅会挂起并保持消息存活。

AMQ消息存储使用数据日志作为其消息日志。这些都是按顺序写入的,并且从来没有实际删除过(这需要随机访问)。还有第二个文件用于跟踪哪些消息已被使用。一旦数据文件中的所有消息都被使用,该文件将被删除。

所以你看到的是数据文件中的一些消息没有被这些持久订阅所消耗,只是挂在那里。持久订阅者的clientid未被一致使用将导致此问题。如果您使用JMX检查代理上的订阅,那么很可能是使用该特性的方式出了问题,这应该有助于您跟踪根本原因。

作为一般规则,无论何时您想要使用持久订阅,都应该使用虚拟主题——它们更容易推理、检查和负载平衡。另一方面,如果您只想在重新连接主题订阅者时获得最后几条消息,而不是可能错过的所有消息,请使用追溯消费者。

解决这个问题的一个简单方法是在发送消息时总是使用一个生存时间——几乎每个用例都有一个消息应该被消耗的时间限制。ActiveMQ将使超过这一点的消息过期,并释放数据文件中的消息以供删除。

最新更新