Jboss Activemq 6.1.0 队列消息处理在 10000 条消息后变慢

Jboss Activemq 6.1.0 queue message processing slows down after 10000 messages

配置如下:

这是第一次执行时的观察结果:

所以我们看到消息消费时间随着消息数量的增加而增加。

不重启任何服务器的第二次执行:

But after deleting data folder of activemq and restarting activemq, performance again improves but degrades as more data enters the queue!

我在 activemq.xml 中尝试了多种配置,但没有成功...

有人遇到过类似的问题,有什么解决办法吗?让我知道。谢谢

当待处理的消息计数变高时,我在我们的生产系统中看到了类似的减速。如果您正在充斥队列,则 MQ 进程无法将所有未决消息保留在内存中,并且必须转到磁盘来提供消息。在这些情况下,性能可能会一落千丈。增加分配给 MQ 服务器进程的内存。

看起来磁盘存储布局也不是特别有效 - 也许将每条消息作为一个文件放在一个目录中?这会使访问时间增加,因为遍历磁盘目录需要更长的时间。

50000 条消息 > 20 分钟似乎性能很低。

以下配置对我来说效果很好(这些只是提示。您可能已经尝试过其中一些,但看看它是否适合您)

1) 服务器和 queue/topic 策略条目

// server
server.setDedicatedTaskRunner(false)
// queue policy entry
policyEntry.setMemoryLimit(queueMemoryLimit); // 32mb
policyEntry.setOptimizedDispatch(true);
policyEntry.setLazyDispatch(true); 
policyEntry.setReduceMemoryFootprint(true);
policyEntry.setProducerFlowControl(true);
policyEntry.setPendingQueuePolicy(new StorePendingQueueMessageStoragePolicy());

2) 如果您使用 KahaDB 进行持久化,则使用每个目标适配器 (MultiKahaDBPersistenceAdapter)。这使每个目的地的存储文件夹保持独立,并减少了同步工作。此外,如果您不担心服务器突然重启(由于任何技术原因),那么您可以将磁盘同步工作减少

kahaDBPersistenceAdapter.setEnableJournalDiskSyncs(false);

3) 尝试增加服务器级别的内存使用、临时和存储磁盘使用值。

4) 如果可能,增加预取策略中的 prefetchSize。这将提高性能,但也会增加消费者的内存占用。

5) 如果可能,在消费者中使用交易。这将有助于减少服务器的消息确认处理和磁盘同步工作。

@hemant1900 提到的第 5 点解决了问题 :) 谢谢。

5) If possible use transactions in consumers. This will help to reduce the message acknowledgement handling and disk sync efforts by server.

问题出在我的代码中。我没有使用事务来将数据保存在消费者中,这无论如何都是糟糕的编程..我知道:(

但没想到会导致这个问题

现在 50000 条消息在不到 2 分钟内得到处理。