При загрузке значительного количества нагрузки в очередь 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&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% использования хранилища?
Спасибо @ tim-bish за ваш ответ. Я посмотрел на консоль, и ни одна из других очередей/тем, казалось, не хватала сообщений, но хранилище полон. Это было после очередного прогона. Кроме того, DLQ не включен. Мы используем встроенный брокер ActiveMQ со вторым до последнего выпуска (5.13.2). Другое дело, что мы не используем KahaDB, вместо этого мы используем LevelDB. – ecrisostomo
Не используйте LevelDB, у него много проблем, и нет добровольцев по течению, чтобы поддерживать его. –
Мы решили эту проблему некоторое время назад, но отметили этот ответ как тот, который решил проблему, потому что на самом деле DLQ заполнял пространство. У нас была конфигурация, которая делала все (или большинство) сообщений в DLQ, даже когда они были успешно обработаны. – ecrisostomo