ActiveMQ:KahaDB和LevelDB磁盘空间扩展缓慢

ActiveMQ:KahaDB和LevelDB磁盘空间扩展缓慢,activemq,apache-karaf,leveldb,apache-servicemix,kahadb,Activemq,Apache Karaf,Leveldb,Apache Servicemix,Kahadb,有人注意到他们的ActiveMQ或LevelDB存储的磁盘空间在缓慢增长吗? 我们正在使用以下工具: Windows Server 2008 SP1(用于部署)和Windows 7 SP1(用于开发) Java 1.7 ActiveMQ 5.11.1和5.13.2(KahaDB和LevelDB都试用过) ServiceMix 5.4.0,其Karaf服务器承载基于Camel的Java应用程序bean,其ActiveMQ服务器未使用 消息速率=每秒传入和传出大约相同的200条XML消息(由Jav

有人注意到他们的ActiveMQ或LevelDB存储的磁盘空间在缓慢增长吗?

我们正在使用以下工具:

  • Windows Server 2008 SP1(用于部署)和Windows 7 SP1(用于开发)
  • Java 1.7
  • ActiveMQ 5.11.1和5.13.2(KahaDB和LevelDB都试用过)
  • ServiceMix 5.4.0,其Karaf服务器承载基于Camel的Java应用程序bean,其ActiveMQ服务器未使用
  • 消息速率=每秒传入和传出大约相同的200条XML消息(由Java应用程序bean翻译成JSON)
  • 队列数量=共享上述消息的大约50个队列;特别是2个队列处理了多达一半的流量
  • 所有消息设置为:
    • 传递持久性=false
    • 生存时间(TTL)=1或2分钟(最大值)
KahaDB

在将ActiveMQ与KahaDB一起使用时,我观察了db*.log文件最初是从db-1.log到db-2.log再到db-3.log的“蛙跳”,并按照预期清理(删除)了旧的db*.log文件。然后,在某个时间点,可能是10小时后,旧的db*.log文件停止清理;新的db*.log文件出现,KahaDB开始以每天约4 GB的速度扩展。当它最终达到我们配置的50GB上限时,服务器当然会停止工作

似乎有一小部分消息无法过期(尽管给出了TTL),从而阻止了正常清理。我已尝试手动删除旧的db*.log文件,但由于警告这些文件仍在使用中,我被阻止这样做

KahaDB*.log文件在文本编辑器中是“半可读的”(!);i、 e.我可以识别应用程序消息,但这并不能告诉我实际发生了什么

LevelDB

我最近尝试在ActiveMQ 5.13.2中使用LevelDB,但存储区的扩展速度似乎要慢得多(大约每天200 MB)

我相信LevelDB数据存储使用压缩;大多数文件都是二进制文件,因此在没有合适的阅读器/浏览器的情况下非常不透明

是否有人找到或实现了一个工具来读取/浏览KahaDB或LevelDB消息存储的非持久性消息

我们的配置

下面是我们的activemq.xml的典型外观:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <value>file:${activemq.conf}/credentials.properties</value>
        </property>
    </bean>
    <bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
        lazy-init="false" scope="singleton"
        init-method="start" destroy-method="stop">
    </bean>

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="XXXX" dataDirectory="${activemq.data}">

        <destinationPolicy>
            <policyMap>
                <policyEntries>
                    <policyEntry topic=">" >
                        <pendingMessageLimitStrategy>
                            <constantPendingMessageLimitStrategy limit="1000"/>
                        </pendingMessageLimitStrategy>
                    </policyEntry>
                    <policyEntry queue=">" producerFlowControl="true" memoryLimit="1mb">
                        <deadLetterStrategy>
                            <discarding /> 
                        </deadLetterStrategy>
                    </policyEntry>
                </policyEntries>
            </policyMap>
        </destinationPolicy>

        <!--
        <managementContext>
            <managementContext createConnector="false"/>
        </managementContext>
        -->
        <managementContext>
            <managementContext createConnector="true" connectorPort="1099"/>
        </managementContext>

        <!--
        <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>
        </persistenceAdapter>
        -->
        <persistenceAdapter>
            <levelDB directory="${activemq.data}/leveldb"/>
        </persistenceAdapter>

        <systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage percentOfJvmHeap="70" />
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

        <networkConnectors>
            <networkConnector
                    uri="XXX"
                    networkTTL="XXX"
                    duplex="XXX"
                    prefetchSize="XXX"
                    userName="${networkconnector.username}"
                    password="${networkconnector.password}"
                    name="XXX" >
                <excludedDestinations>
                </excludedDestinations>
                <staticallyIncludedDestinations>
                    <queue physicalName="XXX" /> 
                    <queue physicalName="XXX" />
                </staticallyIncludedDestinations>
            </networkConnector>
        </networkConnectors>

        <transportConnectors>
            <transportConnector name="amqp"              uri="amqp://0.0.0.0:XXXX?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="openwire"          uri="tcp://0.0.0.0:XXXX?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="openwire-outbound" uri="tcp://0.0.0.0:XXXX?maximumConnections=1000&amp;wireformat.maxFrameSize=104857600"/>
        </transportConnectors>
        <plugins>
            <simpleAuthenticationPlugin>
                <users>
                    <authenticationUser username="XXX"   password="XXX"   groups="XXX" />
                </users>
            </simpleAuthenticationPlugin>
            <authorizationPlugin>
                <map>
                    <authorizationMap>
                        <authorizationEntries>
                            <authorizationEntry topic=">"                    read="XXX"  write="XXX"  admin="XXX" />
                            <authorizationEntry queue=">"                    read="XXX"  write="XXX"  admin="XXX" />
                            <authorizationEntry queue="XXX"                  read="XXX"  write="XXX"  admin="XXX" />
                            <authorizationEntry queue="ActiveMQ.Advisory.>"  read="XXX"  write="XXX"  admin="XXX" />
                            <authorizationEntry topic="ActiveMQ.Advisory.>"  read="XXX"  write="XXX"  admin="XXX" />
                        </authorizationEntries>
                        <tempDestinationAuthorizationEntry>
                            <tempDestinationAuthorizationEntry read="tempDestinationAdmins" write="tempDestinationAdmins" admin="tempDestinationAdmins" />
                        </tempDestinationAuthorizationEntry>
                    </authorizationMap>
                </map>
            </authorizationPlugin>
            <runtimeConfigurationPlugin checkPeriod="1000" />
        </plugins>
        <shutdownHooks>
            <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
        </shutdownHooks>
    </broker>
    <import resource="jetty.xml"/>
</beans>

文件:${activemq.conf}/credentials.properties

这里的问题并不多。好的,在顶部结束这个问题:“有没有人注意到他们的ActiveMQ或LevelDB存储的磁盘空间在缓慢增长,如果有,他们采取了什么措施来解决这个问题?”事实上,有几十种因素可以导致这一问题——通常是由客户端引起的。许多主要原因是.DLQ中的消息未清除、使用者行为不当、交易未完成、使用者速度慢等。