首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ActiveMQ中,是否有可能限制开放的使用者事务所需的内存?

在ActiveMQ中,是否有可能限制开放的使用者事务所需的内存?
EN

Stack Overflow用户
提问于 2014-04-10 01:56:30
回答 1查看 778关注 0票数 6

我目前正在使用ActiveMQ 5.7.0和KahaDB,但如果有必要,可以进行升级。我使用嵌入式代理,并具有编程创建插件和控制代理配置的经验。

在我的应用程序中,我在事务会话上创建了一个使用者。使用者正在将数据传输到另一个服务(而不是ActiveMQ)。这个服务允许我提交工作,但是这些提交可能很昂贵。我发现来自会话的未提交消息被保存在代理的内存中。为了释放代理内存资源,这需要我提交比我想要的更多的时间。理想情况下,我希望控制提交何时发生,而不必考虑ActiveMQ内存利用率。

我目前的算法是:

  • 接收讯息
  • 翻译msg并清除主体,以节省客户端空间(msg.clearBody())
  • 发送msg到服务
  • 定期检查队列内存利用率
  • 如果代理内存至关重要,则提交

我想要做的是:

  • 接收讯息
  • 翻译msg并清除主体,以节省客户端空间(msg.clearBody())
  • 发送msg到服务
  • 定期检查队列磁盘利用率
  • 如果代理磁盘利用率严重,则提交

我看过基于文件的光标,它似乎可以满足我的需要,但是当我尝试使用它时,它似乎没有达到预期的效果。过去也曾在相似问题用户的讨论组中询问过一个ActiveMQ。

更新

澄清。我们的问题不是开放事务中的消息数量,而是消息的大小。我们的应用程序经常需要处理大型消息(>50 to )。除了这个问题之外,ActiveMQ在处理这种大小的消息时也很好。我们正在寻找的是一种在内存资源耗尽时在代理上触发类似msg.clearBody()的方法。然后,如果再次需要消息内容,代理可以从磁盘支持的存储重新加载它们。我们愿意开发一个插件或扩展来实现这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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事务,通过使用非事务队列消耗来评估总体改进。

如果下游提交有很长时间延迟,那么使用并行处理来提高吞吐量的策略可能会奏效:

  • 填写事务
  • 开始提交
  • 同时,继续在下一个事务中使用传入的消息。
  • 填充第二次事务
  • 等待第一次事务提交完成
  • 如果第一个事务失败,则回滚第二个事务。
  • 如果第一个事务成功,则提交第二个事务并启动相同的下一个迭代。

当然,从长远来看,如果下游系统无法跟上传入消息的速度,就不可能防止慢消费问题使代理超载。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22977299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档