在5.0版本後,Activemq實現了一種新的內存模型來防止慢消費者阻塞快速生產者。通常消息在未發生或者發送後未收到消費者的確認信息時都會持久保存消息到存儲中。當有消費者來可以消費消息時,broker會批量從存儲中取出消息,發送給消費者。遊標就是指向下次批量獲取消息時的存儲位置。
根據遊標的保存方式不同,可分爲三種:
Store-based cursors
broker默認採用的遊標。它將遊標信息保存在存儲中。針對速度不同的消費者,這種遊標機制採取的方式不同。對於快速消費者,因爲消費速度很快,存儲中的消息數量會很少,所以不需要遊標。這時,消息發送到broker時,先保存在持久存儲中,然後直接發送給了消費者。而對於慢消費者,消息的持久存儲中會保存大量的消息,所以需要使用遊標來指定下一次批量讀取消息的位置。
VM cursors
若消費者能跟上生產者生產的速度,這時持久存儲中消息雖然不是很多,但是若能也能在內存中保存一些遊標,對獲取存儲中的消息的性能會有很大的提升。
File-based cursors
對VM cursors 的一種改進。當內存中的遊標達到一定限額後,就會將一些遊標存儲到臨時文件中。
Activemq默認使用store-based遊標。當然也可爲不同的Destination修改遊標策略。通過修改destinationPolicy節點來更改默認配置。destinationPolicy節點包含多ge policyMap節點。policyMap包含一個policyEntries節點,policyEntries節點包含多個policyEntry 節點。policyEntry 就是具體的一個遊標策略了。Topics的消費者分爲持久訂閱者和臨時訂閱者,所以有兩套配置。Queues只有一類消費者,所以只有一套配置。對於持久訂閱者可以使用PendingDurableSubscriberMessageStoragePolicy來指定遊標策略。可配置的策略有vmDurableCursor和fileDurableSubscriberCursor.
對於臨時訂閱者可以使用pendingSubscriberPolicy 來指定。可配置的策略有vmCursor和fileCursor。下面是關於Topics的一些xml配置:
- <beans ... >
- <broker ...>
- ...
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry topic="com.iona.>">
- ...
- <pendingSubscriberPolicy>
- <vmCursor />
- </pendingSubscriberPolicy>
- <PendingDurableSubscriberMessageStoragePolicy>
- <fileDurableSubscriberPolicy />
- </PendingDurableSubscriberMessageStoragePolicy>
- ...
- </policyEntry>
- ...
- </policyEntries>
- </policyMap>
- </destinationPolicy>
- ...
- </broker>
- ...
- </beans>
Queues 同樣也有vm和file兩種類型的遊標存儲策略。pendingQueuePolicy 節點的可配置子節點有vmQueueCursor和fileQueueCursor
- <beans ... >
- <broker ...>
- ...
- <destinationPolicy>
- <policyMap>
- <policyEntries>
- <policyEntry queue="com.iona.>">
- ...
- <pendingQueuePolicy>
- <vmQueueCursor />
- </pendingQueuePolicy>
- ...
- </policyEntry>
- ...
- </policyEntries>
- </policyMap>
- </destinationPolicy>
- ...
- </broker>
- ...
- </beans>