ActiveMQ 中的訊息遊標(Message cursors)

五柳-先生發表於2015-11-18
在Activemq以前的版本中,broker會把待傳送的訊息儲存在記憶體中。這種方式的缺陷是當消費者消費的速度趕不上生產者的速度時,會在broker的記憶體中積攢大量的訊息,當達到一個限額後,broker就不再接收訊息。這時生產者就被阻塞了,直到broker將記憶體清理能儲存訊息後才能繼續傳送。 
   在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配置: 
Xml程式碼  收藏程式碼
  1. <beans ... >  
  2.   <broker ...>  
  3.     ...  
  4.     <destinationPolicy>  
  5.       <policyMap>  
  6.         <policyEntries>  
  7.           <policyEntry topic="com.iona.>">  
  8.             ...  
  9.             <pendingSubscriberPolicy>  
  10.               <vmCursor />  
  11.             </pendingSubscriberPolicy>  
  12.             <PendingDurableSubscriberMessageStoragePolicy>  
  13.               <fileDurableSubscriberPolicy />  
  14.             </PendingDurableSubscriberMessageStoragePolicy>  
  15.             ...  
  16.           </policyEntry>  
  17.           ...  
  18.         </policyEntries>  
  19.       </policyMap>  
  20.     </destinationPolicy>  
  21.     ...  
  22.   </broker>  
  23.   ...  
  24. </beans>  


Queues 同樣也有vm和file兩種型別的遊標儲存策略。pendingQueuePolicy 節點的可配置子節點有vmQueueCursor和fileQueueCursor 
Xml程式碼  收藏程式碼
  1. <beans ... >  
  2.   <broker ...>  
  3.     ...  
  4.     <destinationPolicy>  
  5.       <policyMap>  
  6.         <policyEntries>  
  7.           <policyEntry queue="com.iona.>">  
  8.             ...  
  9.             <pendingQueuePolicy>  
  10.               <vmQueueCursor />  
  11.             </pendingQueuePolicy>  
  12.             ...  
  13.           </policyEntry>  
  14.           ...  
  15.         </policyEntries>  
  16.       </policyMap>  
  17.     </destinationPolicy>  
  18.     ...  
  19.   </broker>  
  20.   ...  

  1. </beans>  

轉載: http://berdy.iteye.com/blog/814370

相關文章