ActiveMQ的消息存儲機制

jopen 9年前發布 | 24K 次閱讀 ActiveMQ 消息系統


/* 轉載請注明作者longdick http://longdick.iteye.com

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配置文件里添加上如下配置:







<persistenceAdapter> 
<amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>
 </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,我們只需要把配置從


<persistenceAdapter> 
<amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>



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


<persistenceAdapter>
<journaledJDBC dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>
</persistenceAdapter>


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



<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracle-ds"/>
</persistenceAdapter>



Oracle數據源的配置如下:


<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
      <property name="username" value="scott"/>
      <property name="password" value="tiger"/>
      <property name="maxActive" value="200"/>
      <property name="poolPreparedStatements" value="true"/>
    </bean>


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



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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!