activemq的消息存儲機制

轉自:http://longdick.iteye.com/blog/444632

 

ActiveMQ是當下最流行和強大的開源企業消息集成組件。
ActiveMQ性能優良,支持多種跨語言的客戶端和協議,支持JMS1.1和J2EE1.4,易於使用並且特性多多。
ActiveMQ基於Apache 2.0 License軟件協議。


當前最新版本爲5.2.0

 

最新特性:

  • 多語言多協議支持,Java、C、C++、C#可以通過OpenWire協議編寫高效的客戶端;
  • Stomp協議的支持使得我們可以用Ruby、Perl、Python、AS等等語言方便的編寫客戶端程序。 
  • 通過集成Apache Camel 庫,中間件和客戶端可以完全支持Enterprise Integration Patterns(企業集成模式)
    支持許多高級特性如:消息羣組(Message Groups)、虛擬端點(Virtual Destinations)、通配符(Wildcards)、複合端點(Composite Destinations)等
  •  完全支持JMS1.1和J2EE1.4規範包括對臨時、持久、XA事務消息的支持
  • spring支持JMS規範,所以Acticemq可以集成到spring,集中管理。
  • 在支持J2EE1.4規範的多個流行J2EE服務器上通過測試。
  • 可插拔的傳輸協議支持 比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports
  • 支持超快的JDBC消息持久化和高效的日誌系統
  • 爲高效服務集羣、客戶服務機、基於點通信系統而設計。
  • REST-ful支持。
  • Ajax支持。
  • 對CXF和Axis的支持可以幫助Activemq通過web service來提供可靠的消息服務。
  • 等等。。。

 ActiveMq5.2.0 對JDK的要求是 JDK 5 and later。如果要搭建MQ服務,那麼在目標機器上必須設置JAVA_HOME變量,指向JDK的安裝目錄。


 依賴: 
 要正常使用ActiveMq的功能至少需要activemq-core.jar、commons-logging.jar、J2EE API。

 

 

AMQ Message Store 是什麼?

默認的activemq消息存儲是通過一個所謂的AMQ Message Store來完成。
AMQ Message Store是一個高效的可嵌入支持事務的消息存儲解決方案。
在此方案下消息(Message)本身以日誌的形式實現持久化,存放在Data Log裏。並且還對日誌裏的消息做了引用索引,方便快速取回Message。


一般情況下消息索引存放於內存(Cache)中,MQ Server定期將索引內容持久化,存放到Reference Store。
Message Data Log文件是有容量限制的,默認是32MB,可自行配置容量。當該Data Log文件裏所有消息都被消費完的時候,Data Log文件就會被加上一個標記,通知下一次消息清理時可以被處理掉(處理方式可以是delete或是轉移到Achieve目錄)。

 

AMQ Message Store方案中 Cache 、Data Log、Reference Store 協作圖如下:

 

AMQ Message Store的屬性是可以配置的,
你可以在conf/activemq.xml配置文件裏添加上如下配置:

 

 

 

 

 

 

 

 

Xml代碼  收藏代碼
  1. <persistenceAdapter>   
  2. <amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>  
  3.  </persistenceAdapter>   

 

屬性說明

property name

default value

Comments

directory

activemq-data

存儲消息文件和日誌的目錄

useNIO

true

使用 NIO 特性

syncOnWrite

false

同步寫文件到磁盤

maxFileLength

32mb

Message Data日誌文件的最大 Size

persistentIndex

true

持久化日誌索引,如果設爲 false ,則在內存中保存

maxCheckpointMessageAddSize

4kb

在自動提交前在事務中能保持的最大消息數

cleanupInterval

30000

每隔多少時間清理不再使用的消息日誌(毫秒)

indexBinSize

1024

這個值是用來提升索引的性能的,值越大,索引相對性能越好

indexKeySize

96

index key的size,index key基於message id

indexPageSize

16kb

索引頁的size

directoryArchive

archive

消費完的Data Log存放的目錄

archiveDataLogs

false

設置爲true的話,消費完的Data Log就放到Archive目錄,而不是刪除。

 

 

AMQ Message Store體系中 目錄結構參照下圖 :

 

頂層目錄broker name
用broker name命名,默認目錄名是localhost,broker name在activemq的配置文件裏指定,以下是它的子目錄:

 

archive
丟棄的Data Log就放到這裏,當archiveDataLogs 屬性配置爲true時纔會存在

 

journal
message data log的所在

 

kr-store
reference store 目錄

 

data
引用索引所在目錄

 

state
記錄store的狀態

 

tmp-storage
用來存儲一些事物性的消息以減輕內存的負擔例如等待正常但是速度很慢的消費端來消費非持久化的Topic.

 

 

其他持久化方式
 activemq同樣支持JDBC持久化Message,我們只需要把配置從

 

Xml代碼  收藏代碼
  1. <persistenceAdapter>   
  2. <amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>  
  3. </persistenceAdapter>  

 

 
改成AMQ Message Store and JDBC(推薦,同時使用兩者可以同時保證效率和可靠性):

 

Xml代碼  收藏代碼
  1. <persistenceAdapter>  
  2. <journaledJDBC dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>  
  3. </persistenceAdapter>  

 

 或是 JDBC only(現階段不推薦,單獨的JDBC存儲效率不高):

 

 

Xml代碼  收藏代碼
  1. <persistenceAdapter>  
  2. <jdbcPersistenceAdapter dataSource="#oracle-ds"/>  
  3. </persistenceAdapter>  

 

 

Oracle數據源的配置如下:

 

Xml代碼  收藏代碼
  1. <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  2.       <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>  
  3.       <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>  
  4.       <property name="username" value="scott"/>  
  5.       <property name="password" value="tiger"/>  
  6.       <property name="maxActive" value="200"/>  
  7.       <property name="poolPreparedStatements" value="true"/>  
  8.     </bean>  

 
其他數據源配置參照Activemq的文檔。

 


參考資料來自官方網站:
http://activemq.apache.org

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章