我目前正在使用ActiveMQ 5.7.0和KahaDB,但如果有必要,可以进行升级。我使用嵌入式代理,并具有编程创建插件和控制代理配置的经验。
在我的应用程序中,我在事务会话上创建了一个使用者。使用者正在将数据传输到另一个服务(而不是ActiveMQ)。这个服务允许我提交工作,但是这些提交可能很昂贵。我发现来自会话的未提交消息被保存在代理的内存中。为了释放代理内存资源,这需要我提交比我想要的更多的时间。理想情况下,我希望控制提交何时发生,而不必考虑ActiveMQ内存利用率。
我目前的算法是:
msg.clearBody())我想要做的是:
msg.clearBody())我看过基于文件的光标,它似乎可以满足我的需要,但是当我尝试使用它时,它似乎没有达到预期的效果。过去也曾在相似问题用户的讨论组中询问过一个ActiveMQ。
更新
澄清。我们的问题不是开放事务中的消息数量,而是消息的大小。我们的应用程序经常需要处理大型消息(>50 to )。除了这个问题之外,ActiveMQ在处理这种大小的消息时也很好。我们正在寻找的是一种在内存资源耗尽时在代理上触发类似msg.clearBody()的方法。然后,如果再次需要消息内容,代理可以从磁盘支持的存储重新加载它们。我们愿意开发一个插件或扩展来实现这一点。
发布于 2014-04-11 03:51:23
正如我在ActiveMQ留言板上所说.http://activemq.2283324.n4.nabble.com/Transactions-and-memory-consumption-td4224862.html。
在事务进行期间,ActiveMQ中没有办法从内存中清除这些消息。事务的数据结构保存消息引用。
在队列的内存中,仅通过以下之一向JVM GC提供消息:
我对用例非常好奇,因为考虑到JVM堆大小很大,代理可以在内存中保存大量消息。什么样的性能数字是可以看到的,通过增加数量期望有多大的改进?应该可以通过定期使用添加的Session.commit()调用进行测试,或者,对于XA事务,通过使用非事务队列消耗来评估总体改进。
如果下游提交有很长时间延迟,那么使用并行处理来提高吞吐量的策略可能会奏效:
当然,从长远来看,如果下游系统无法跟上传入消息的速度,就不可能防止慢消费问题使代理超载。
https://stackoverflow.com/questions/22977299
复制相似问题