啟動腳本設置jvm的內存
if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xms1G-Xmx1G -Djava.util.logging.config.file=logging.properties
broker配置中的系統內存和磁盤空間使用量
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsagelimit="64 mb"/>
</memoryUsage>
<storeUsage>
<storeUsagelimit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsagelimit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
如果是嵌入式(embedded)方式使用的話,可以new一個SystemUsage來添加到BrokerService中去。這裡配置的memoryUsage一定要小於jvm中設置的數量。
5.9.0版本,如果設置的 memoryUsagelimit大於實際可用java heap size值,比如默認啟動 xmx=1G,那麼實際的java heap size大概是910M,
則broker啟動時會log.error提示設置內存出錯,然後強制使用實際java heap size* 70% = 637M作為memoryUsagelimit。
splitSystemUsageForProducersConsumers導致消費緩慢甚至無法消費的問題
其實broker中還可以單獨配置生產者使用的producerSystemUsage 和消費者使用的consumerSystemUsage,格式跟systeUsage一樣。
默認情況下,沒有配置producerSystemUsage 和 consumerSystemUsage,則生產者和消費者都使用systemUsage。
這時可能會因為生產者線程把內存用完,導致消費者線程處理緩慢甚至無法消費的問題。這種情況下,添加消費端的機器和消費者數量可能都無法增加消費的速度。
解決辦法就是:
在broker上設置splitSystemUsageForProducersConsumers=”true”,使得生產者線程和消費者線程各使用各的內存。
默認是 生產者線程內存:消費者線程內存 = 6:4。
也可以通過如下兩個參數設置生產者線程內存和消費者線程內存各一半:
producerSystemUsagePortion = 50
consumerSystemUsagePortion = 50
生產者流控
從5.x版本起,可以給每個producer單獨設置流控。流控簡單的說就是控制生產者的在內存使用限制下的行為。當然,流控的目的在於防止在將ActiveMQ作為內存MQ使用時,生產速度大於消費速度時將MQ撐爆的問題。
分兩個情況:
1、 同步發送消息(useAsynSend為false):此時將在SystemUsage的限制下,使用destinationPolicy中的policyEntry中的限制,例如:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="queueA"producerFlowControl="true"memoryLimit="1mb">
<pendingQueuePolicy>
<vmQueueCursor/>
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
限制非持久化時queueA 的內存使用量為1mb,達到這個內存使用量時直接阻塞掉producer,直到有空余的內存時,才允許producer發送消息。
也可通過在systemUsage配置上設置sendFailIfNoSpace="true"或 sendFailIfNoSpaceAfterTimeout="3000"來控制客戶端異常和等待時間。
異步發送時,由於不阻塞生產者,
可以通過connctionFactory.setProducerWindowSize(1024000);
來控制broker確認收到消息前生產者能發送的最大數據量(字節)。
消費者流控
消費者端,一般來說消費的越快越好,broker的積壓越小越好。
但是考慮到事務性和客戶端確認的情況,如果一個消費者一次獲取到了很多消息卻都不確認,這會造成事務上下文變大,broker端這種“半消費狀態”的數據變多,所以ActiveMQ有一個prefetchSize參數來控制未確認情況下,最多可以預獲取多少條記錄。
默認情況如下:
持久化queue:1000條
非持久化queue: 1000條
持久化topic:100條
非持久化topic: 無限制
可以通過3中方式設置prefetchSize
1、 tcp://localhost:61616?jms.prefetchPolicy.all=50
2、 tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1
3、 queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
推薦閱讀:
Linux系統下ActiveMQ 安裝 http://www.linuxidc.com/Linux/2012-03/55623.htm
Ubuntu下的ACTIVEMQ服務器 http://www.linuxidc.com/Linux/2008-07/14587.htm
Spring+JMS+ActiveMQ+Tomcat實現消息服務 http://www.linuxidc.com/Linux/2011-10/44632.htm
Linux環境下面ActiveMQ端口號設置和WEB端口號設置 http://www.linuxidc.com/Linux/2012-01/51100.htm