gpt4 book ai didi

ActiveMQ - Kahadb 日志文件不会清除

转载 作者:行者123 更新时间:2023-12-01 00:39:16 51 4
gpt4 key购买 nike

我的任务是调查 db-*.log 文件未清除的原因。

从我通过大量搜索发现的结果来看,一切都指向仍在队列中的消息。我已经查看了所有配置主题的队列中的 hawtio,队列大小为零。

根据我的理解,理论上的入队大小和出队大小应该是相同的,但它们不是。似乎我的出队大小是 0。

我已经查看了这些主题,并且没有清除它们的操作。

我希望能够清除所有消息,以便 kahadb 日志消失。

最佳答案

我认为您指出了 ActiveMQ 本身的一个弱点:它不能保证消费者在消费消息时真的很严格。

我们的 ActiveMQ (5.10.7) 也有类似的问题,因为 KahaDB 似乎喜欢“磁盘碎片”,我们注意到这可能来自消费者的至少两个问题:

案例 1:慢消费者

我们的系统中有一个消费者,它不能一次消费很多消息。如果 KahaDB 页面中只有一条未使用的消息,它将保留整个页面(以及所有其他已使用并已确认的消息)。
为了防止 KahaDB 存储达到 100%(这会减慢生产者的速度),我们将消息传输到另一个 ActiveMQ 实例临时队列中,如下所示:

from("activemqPROD:queue:BIG_QUEUE_UNCONSUMED")
.to("activemqTEMP:queue:TEMP_BIG_QUEUE");

然后把它们推回去:
from("activemqTEMP:queue:TEMP_BIG_QUEUE")
.to("activemqPROD:queue:BIG_QUEUE_UNCONSUMED");

另一种方法是将它们存储在文件系统上,然后重新加载它们,但会丢失 JMS(和自定义) header 。使用临时队列解决方案,您可以保留所有标题。

案例2:从不承认的消费者

有时即使我们进行了之前的操作,即使所有未消耗的队列都是空的,存储仍然高于0%。
通过查看 KahaDB 文件,我们可以看到仍然存在页面,甚至所有队列中都没有更多消息。
对于 TOPICS,我们停止使用持久订阅,那么存储也应该保持在 0%。

潜在的原因(这是一个假设,但有很强的信心)是一些消费的消息从来没有 acknowledged适本地。
我们之所以认为这是原因,是因为在日志中,我们仍然可以看到消息
"not removing data file: 12345 as contained ack(s) refer to referenced file: [12344, 12345]" 

这可能发生在例如消费者突然断开连接时(他们消费了一些消息但在发送 ack 之前断开连接)
在我们的例子中,消息永远不会过期,那么这也可能是这种情况下的潜在问题。然而,设置过期是否可以破坏“未确认”消息尚不清楚。
因为我们不想丢失任何事件,所以这些特定队列没有过期时间。

根据你的问题,看起来你是第二种情况,那么我们的解决方案是:
  • 确保没有更多的生产者/消费者连接到 ActiveMQ
  • 确保所有队列和持久主题都为空
  • 删除 KahaDB 存储中的所有文件(从文件系统)
  • 重启 ActiveMQ(新鲜)

  • 不幸的是,我们没有找到更好的方法来处理这些案例,如果其他人有更好的选择,我们很乐意知道。

    This article还可以为您提供一些解决方案(例如为 ActiveMQ.DLQ 队列设置到期策略)。

    关于ActiveMQ - Kahadb 日志文件不会清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38502383/

    51 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com