2016-07-11 4 views
3

При загрузке значительного количества нагрузки в очередь ActiveMQ кажется, что он помещает/выгружает сообщения, как и предполагалось, но хранилище остается заполненным.ActiveMQ не освобождает дисковое хранилище для очереди

Это заставляет производителя блокировать через некоторое время, когда хранилище достигает 100%, что, в свою очередь, заставляет приложение перестать отвечать на запросы.

Это отношение ActiveMQ конфигурации Spring, которые мы используем:

<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 
         http://activemq.apache.org/schema/core 
         http://activemq.apache.org/schema/core/activemq-core.xsd"> 

<!-- ===================================================== 
    Broker Configuration 
    ===================================================== --> 
<broker id="appEmbeddedBroker" 
     xmlns="http://activemq.apache.org/schema/core" 
     brokerName="${msg.embedded.broker.name}" 
     persistent="true" 
     dataDirectory="${msg.embedded.broker.data.directory}" 
     useJmx="true" > 

    <destinationPolicy> 
     <policyMap> 
      <policyEntries> 
       <policyEntry topic=">" > 
        <pendingMessageLimitStrategy> 
         <constantPendingMessageLimitStrategy limit="1000"/> 
        </pendingMessageLimitStrategy> 
       </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

    <managementContext> 
     <managementContext connectorPort="${msg.embedded.broker.jmx.port}" createConnector="false"/> 
    </managementContext> 

    <persistenceAdapter> 
     <levelDB directory="${msg.embedded.broker.db.directory}" /> 
    </persistenceAdapter> 

    <systemUsage> 
     <systemUsage> 
      <memoryUsage> 
       <memoryUsage percentOfJvmHeap="10"/> 
      </memoryUsage> 
      <storeUsage> 
       <storeUsage limit="${msg.embedded.broker.system.usage.store.usage}"/> <!-- Configured for 200Mb --> 
      </storeUsage> 
      <tempUsage> 
       <tempUsage limit="${msg.embedded.broker.system.usage.temp.usage}"/> <!-- Configured for 40Mb --> 
      </tempUsage> 
     </systemUsage> 
    </systemUsage> 

    <plugins> 
     <!-- Configure authentication; Username, passwords and groups --> 
     <simpleAuthenticationPlugin anonymousAccessAllowed="false"> 
      <users> 
       <authenticationUser username="app" password="${msg.embedded.broker.app.password}" 
            groups="users"/> 
      </users> 
     </simpleAuthenticationPlugin> 
    </plugins> 

    <transportConnectors> 
     <transportConnector name="tcp" uri="tcp://0.0.0.0:${msg.embedded.broker.port}?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 
    </transportConnectors> 

    <shutdownHooks> 
     <bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" /> 
    </shutdownHooks> 

</broker> 


<!-- ===================================================== 
    Client Connections 
    ===================================================== --> 

<bean id="embeddedAmqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" depends-on="appEmbeddedBroker" > 
    <property name="brokerURL" value="${msg.embedded.broker.url}" /> 
    <property name="userName" value="${msg.embedded.client.app.username}" /> 
    <property name="password" value="${msg.embedded.broker.app.password}" /> 
</bean> 

<bean id="embeddedAmqPooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" > 
    <property name="connectionFactory" ref="embeddedAmqConnectionFactory" /> 
    <property name="maxConnections" value="${msg.embedded.client.connection.pool.max}" /> 
</bean> 

При запросе бобы:

$>get QueueSize EnqueueCount DequeueCount                     

#mbean = org.apache.activemq:brokerName=app-embedded,destinationName=the.queue.name.local,destinationType=Queue,type=Broker: 

QueueSize = 0; 


EnqueueCount = 17821; 


DequeueCount = 17821; 

А:

#mbean = org.apache.activemq:brokerName=app-embedded,type=Broker: 

StoreLimit = 209715200; 


StorePercentUsage = 100; 


TempLimit = 41943040; 


TempPercentUsage = 0; 

Так , квест on было бы: Почему, если все сообщения обходятся, мы по-прежнему видим 100% использования хранилища?

ответ

1

Это может быть много причин в зависимости от конфигурации и использования брокера. Первое, что нужно проверить, - это содержимое вашего DLQ, а затем посмотрите на консоль для других адресов, которые хранятся в сообщениях. Из-за того, как вещи распространяются через журналы журнала KahaDB, возможно, что они создают цепочку, которая не может быть прервана до тех пор, пока вы не очистите некоторые другие очереди или откатите какие-либо транзакции, которые все еще текут и т.д.

Существует guide на Сайт ActiveMQ, посвященный началу отладки ситуации, которая должна помочь вам начать работу.

Также попробуйте запустить последнюю версию брокера, есть исправления, которые вошли в эти компоненты, которые пытаются и могут справиться с подобными ситуациями.

+0

Спасибо @ tim-bish за ваш ответ. Я посмотрел на консоль, и ни одна из других очередей/тем, казалось, не хватала сообщений, но хранилище полон. Это было после очередного прогона. Кроме того, DLQ не включен. Мы используем встроенный брокер ActiveMQ со вторым до последнего выпуска (5.13.2). Другое дело, что мы не используем KahaDB, вместо этого мы используем LevelDB. – ecrisostomo

+0

Не используйте LevelDB, у него много проблем, и нет добровольцев по течению, чтобы поддерживать его. –

+0

Мы решили эту проблему некоторое время назад, но отметили этот ответ как тот, который решил проблему, потому что на самом деле DLQ заполнял пространство. У нас была конфигурация, которая делала все (или большинство) сообщений в DLQ, даже когда они были успешно обработаны. – ecrisostomo

Смежные вопросы