【问题标题】:ActiveMQ KahaDB Persistence Store FullActiveMQ KahaDB 持久存储已满
【发布时间】:2012-01-09 05:18:15
【问题描述】:

我使用 ActiveMQ 5.4 和 KahaDB 作为消息存储。 在将消息(持久性为真)发布到具有持久订阅者的主题时,即使消息被分派到订阅者,持久性存储也在增加。因此,由于消息存储已满并且不再接受任何消息,因此这会导致问题。

所以我的问题是,为什么 Persistence 存储没有丢弃 KahaDB 中的消息,甚至消息都被分派了?

问候,

斯里尼瓦

【问题讨论】:

    标签: activemq


    【解决方案1】:

    您看到的是ActiveMQ message store 行为与durable subscriptions on topics 行为之间的交互。

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

    AMQ 消息存储使用数据日志作为其消息日志。这些是按顺序写入的,并且从未真正从中删除(这将需要随机访问)。还有一个文件记录了哪些消息已被消费。一旦数据文件中的所有消息都被消费完,该文件就会被删除。

    因此,您所看到的是数据文件中的一些消息没有被这些持久订阅消耗,而只是徘徊。未始终使用的持久订阅者的 ClientId 会导致此问题。如果您使用 JMX 检查代理上的订阅,这可能会帮助您找到根本原因,那么该功能的使用方式可能存在问题。

    作为一般规则,每当您认为您可能想要使用持久订阅时,请改用virtual topics - 它们更容易推理、检查和负载平衡。另一方面,如果您只想在重新连接主题订阅者时获得最后几条消息,而不是您可能错过的所有消息,请使用retroactive consumers

    解决此问题的一种简单方法是在发送消息时始终use a time to live - 几乎每个用例都有一个时间限制,即无论如何都应该使用消息。 ActiveMQ 将使超过此时间点的消息过期,并释放数据文件中的消息以供删除。

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2018-09-22
      • 2013-05-15
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多