gpt4 book ai didi

java - 通过队列发送大文件时 Activemq 内存不足

转载 作者:行者123 更新时间:2023-11-30 02:57:49 24 4
gpt4 key购买 nike

当使用队列发送 100MB 大小的消息时,ActiveMQ 遇到内存不足错误,我们对队列使用文件游标 -

队列详细信息 - 我们的生产者以每条消息 100MB 的大小发送非持久消息,并且生产者将通过 while 循环继续生产相同的 100MB 消息。

我们使用 activeMQ 附带的默认堆大小,最大为 1GB。

我们的 ActiveMQ 配置设置如下:

<policyEntry queue=">" producerFlowControl="false" memoryLimit="512mb" maxPageSize="1000000">               
<pendingQueuePolicy>
<fileQueueCursor />
</pendingQueuePolicy>
</policyEntry>

在消费端,我们有一个异步消费者,它将继续监听传入的消息并发送自动确认。

该程序运行一段时间后,activeMQ 抛出以下错误:

    2016-04-21 14:52:18,961 | ERROR | Error in thread 'ActiveMQ BrokerService.worker.1' | org.apache.activemq.broker.BrokerService | ActiveMQ BrokerService.worker.1
java.lang.OutOfMemoryError: Java heap space
at org.apache.activemq.util.DataByteArrayOutputStream.ensureEnoughBuffer(DataByteArrayOutputStream.java:249)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.util.DataByteArrayOutputStream.writeBoolean(DataByteArrayOutputStream.java:140)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.BaseDataStreamMarshaller.looseMarshalByteSequence(BaseDataStreamMarshaller.java:627)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.MessageMarshaller.looseMarshal(MessageMarshaller.java:300)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.ActiveMQMessageMarshaller.looseMarshal(ActiveMQMessageMarshaller.java:111)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.ActiveMQTextMessageMarshaller.looseMarshal(ActiveMQTextMessageMarshaller.java:111)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.OpenWireFormat.marshal(OpenWireFormat.java:161)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.getByteSequence(FilePendingMessageCursor.java:480)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.flushToDisk(FilePendingMessageCursor.java:440)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.onUsageChanged(FilePendingMessageCursor.java:401)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.usage.Usage$1.run(Usage.java:308)[activemq-client-5.13.1.jar:5.13.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_74]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_74]
at java.lang.Thread.run(Thread.java:745)[:1.8.0_74]

有谁知道如何解决这个问题吗?当我不断发送较小尺寸的消息(例如小于 10MB 的消息)时,这种情况似乎不会发生。

最佳答案

非持久消息将存储在内存中,而不是持久保存到数据存储中,如 here 中所述。 。因此,1GB 将很快消失,特别是如果您的消费速度无法 catch 生产速度。

当然,您可以在 activemq.xml 中增加分配给 ActiveMQ 的内存量,但您最好坚持下去,即使您不需要恢复,并且可能会在模拟一段时间后使消息过期非持久性(如果需要)。

我建议其他解决方案,例如将消息分解为更易于管理的内容,或者使用数据的共享文件存储并发送包含指向数据的指针的消息。除了 ActiveMQ 的处理开销之外,相信您还会产生比正常情况更大的网络影响(例如,如果您与 AMQ 实例进行安全通信,那么您将加密/解密 100M 消息,这并不便宜)。

关于java - 通过队列发送大文件时 Activemq 内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36778493/

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