gpt4 book ai didi

apache-camel - Camel ActiveMQ 客户端阻塞,临时存储使用率立即达到 100%

转载 作者:行者123 更新时间:2023-12-04 04:51:25 24 4
gpt4 key购买 nike

我看到 activemq 的临时存储(配置为 100mb)的利用率为 100%,并且 activemq 客户端正在阻塞。这个 100% 使用率永久保持,我不知道发生了什么

我有一条 Camel 路线,它使用 JmsTransactionManager 从队列 (QUEUE.IN) 中消耗。

public final class RouteUnderTest extends RouteBuilder {

@Override
public void configure() throws Exception {
from("activemq-transacted:QUEUE.IN")
.bean(myBean)
.to("activemq:QUEUE.OUT");
}
}

在处理来自该队列的消息时,我正在调用一个 Spring 集成客户端 (myBean),其配置如下
<int:gateway id="myBean" service-interface="MyBean">
<int:method name="request" request-channel="channel"/>
</int:gateway>

<int:chain input-channel="channel">
<int:transformer ref="transformedToJsonHere"/>
<jms:outbound-gateway request-destination-name="QUEUE.MYBEAN"
receive-timeout="5000"
explicit-qos-enabled="true"
time-to-live="5000"
delivery-persistent="false"/>
<int:transformer ref="transformedToAnObjectHere"/>
</int:chain>

我的经纪人配置为使用 LevelDB,并具有以下使用限制:
<persistenceAdapter>
<levelDB directory="${activemq.data}/leveldb"/>
</persistenceAdapter>

<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="500 mb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="100 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>

当我的路由使用消息然后尝试将非持久消息放在 QUEUE.OUT 上时,客户端被阻止,我的代理显示 100% 的临时存储使用率。

broker web console

我看到以下activemq日志
2015-07-28 15:44:59,678 | INFO  | Usage(default:temp:queue://QUEUE.MYBEAN:temp) percentUsage=0%, usage=104857600, limit=104857600, percentUsageMinDelta=1%;Parent:Usage(default:temp) percentUsage=100%, usage=104857600, limit=104857600, percentUsageMinDelta=1%: Temp Store is Full (0% of 104857600). Stopping producer (ID:orbit-vm-55561-1438094698190-1:1:3:1) to prevent flooding queue://QUEUE.MYBEAN. See http://activemq.apache.org/producer-flow-control.html for more info (blocking for: 1s) | org.apache.activemq.broker.region.Queue | ActiveMQ NIO Worker 6

队列看起来像(您可以看到 QUEUE.IN 消息尚未出列,因为它仍在事务处理中,并且没有消息进入 QUEUE.MYBEAN)
enter image description here

我可以使用以下任何一种方法解决此问题:
  • 使用 KahaDB 代替 LevelDB
  • 增加临时存储限制(150MB 似乎可以做到,但我没有做过很多实验)
  • 在 activemq.xml 中配置 tempDataStore(见下文)

  • 配置 tempDataStore 时,它​​看起来像:
    <tempDataStore> 
    <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.leveldb.LevelDBStore">
    <property name="directory" value="${activemq.data}/tmp" />
    </bean>
    </tempDataStore>

    我应该补充一点,我们以前使用 KahaDB 并且效果很好,但是升级到 LevelDB 暴露了这个问题。恢复到 KahaDB 不是一种选择。

    我希望有人可以解释我们在这里看到的情况,因为结果真的很难理解。为什么使用 LevelDB 需要更高的临时使用限制?为什么显式配置 tempDataStore 也可以解决问题?

    我不完全理解这里发生了什么,所以我担心只是稍微增加临时使用限制只会将问题隐藏到以后。

    版本:
  • ActiveMQ : 5.11.1
  • Camel : 2.14.0
  • Spring : 4.0.8.RELEASE
  • Spring集成 : 4.0.5.RELEASE
  • 最佳答案

    我们遇到了与 ActiveMQ 5.13.2 完全相同的问题

    使用LevelDB时的解决方法是到显式配置专用 tempDataStore 正如你所做的那样。

    如果不是,则代理为持久(持久使用)和非持久消息(临时使用)使用相同的存储 (LevelDB)。因此,您可能会遇到这样的情况,即代理不再接受任何非持久性消息,因为存储已经将持久性消息保存到配置的 tempUsage 之前。限制。但是,如果您的 storeUsage,它会接受持久的。限制设置得更高...

    使用 KahaDB 时,代理会自动使用另一个存储非持久性消息(在 tmp 目录中创建)。所以你没有这个问题...

    查看以下代码以获取更深入的信息:https://github.com/apache/activemq/blob/activemq-5.13.2/activemq-broker/src/main/java/org/apache/activemq/broker/BrokerService.java#L1739

    阅读该代码时,请记住 LevelDBStore 实现 PListStore ,但 KahaDBStore 没有...

    关于apache-camel - Camel ActiveMQ 客户端阻塞,临时存储使用率立即达到 100%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31680202/

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