1. 程式人生 > >ActiveMQ使用筆記(七)ActiveMQ效能優化

ActiveMQ使用筆記(七)ActiveMQ效能優化

1、目標策略

在節點destinationPolicy配置策略,可以對單個或者所有的主題和佇列進行設定,使用流量監控,當訊息達到memoryLimit的時候,ActiveMQ會減慢訊息的產生甚至阻塞,destinationPolicy的配置如下:

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <destinationPolicy> <policyMap> <policyEntries> <policyEntry topic=">"producerFlowControl
="true"memoryLimit="1mb"> <pendingSubscriberPolicy> <vmCursor/> </pendingSubscriberPolicy> </policyEntry> <policyEntry queue=">"producerFlowControl="true"memoryLimit="1mb"> <!--UseVM cursor forbetter latency Formore information,see: http://activemq.apache.org/message-cursors.html             
<pendingQueuePolicy> <vmQueueCursor/> </pendingQueuePolicy> --> </policyEntry> </policyEntries> </policyMap> </destinationPolicy>

producerFlowControl表示是否監控流量,預設為true,如果設定為false,訊息就會存在磁碟中以防止記憶體溢位;memoryLimit表示在producerFlowControl=”true”的情況下,訊息儲存在記憶體中最大量,當訊息達到這個值時,ActiveMQ會減慢訊息的產生甚至阻塞。policyEntry的屬性參考:

http://activemq.apache.org/per-destination-policies.html

當producer傳送的持久化訊息到達broker之後,broker首先會把它儲存在持久儲存中。接下來,如果發現當前有活躍的consumer,如果這個consumer消費訊息的速度能跟上producer生產訊息的速度,那麼ActiveMQ會直接把訊息傳遞給broker內部跟這個consumer關聯的dispatch queue;如果當前沒有活躍的consumer或者consumer消費訊息的速度跟不上producer生產訊息的速度,那麼ActiveMQ會使用Pending Message Cursors儲存對訊息的引用。在需要的時候,Pending Message Cursors把訊息引用傳遞給broker內部跟這個consumer關聯的dispatch queue。以下是兩種Pending Message Cursors:

VM Cursor:在記憶體中儲存訊息的引用。

File Cursor:首先在記憶體中儲存訊息的引用,如果記憶體使用量達到上限,那麼會把訊息引用儲存到臨時檔案中。

在預設情況下,ActiveMQ 會根據使用的Message Store來決定使用何種型別的Message Cursors,但是你可以根據destination來配置Message Cursors。

對於topic,可以使用的pendingSubscriberPolicy 有vmCursor和fileCursor。可以使用的PendingDurableSubscriberMessageStoragePolicy有

vmDurableCursor 和 fileDurableSubscriberCursor;對於queue,可以使用的pendingQueuePolicy有vmQueueCursor 和 fileQueueCursor。

2、儲存設定

設定訊息在記憶體、磁碟中儲存的大小,配置如下:

Java
1 2 3 4 5 6 7 8 9 10 11 12 13 <systemUsage> <systemUsage> <memoryUsage> <memoryUsage limit="20 mb"/> </memoryUsage> <storeUsage> <storeUsage limit="1 gb"/> </storeUsage> <tempUsage> <tempUsage limit="100 mb"/> </tempUsage> </systemUsage> </systemUsage>

memoryUsage表示ActiveMQ使用的記憶體,這個值要大於等於destinationPolicy中設定的所有佇列的記憶體之和。

storeUsage表示持久化儲存檔案的大小。

tempUsage表示非持久化訊息儲存的臨時記憶體大小。