ActiveMQ支持JMS規(guī)范中的持久化消息與非持久化消息
創(chuàng)新互聯(lián)建站專注于浠水網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供浠水營銷型網(wǎng)站建設(shè),浠水網(wǎng)站制作、浠水網(wǎng)頁設(shè)計(jì)、浠水網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造浠水網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供浠水網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
持久化消息通常用于不管是否消費(fèi)者在線,它們都會保證消息會被消費(fèi)者消費(fèi)。當(dāng)消息被確認(rèn)消費(fèi)后,會從存儲中刪除
非持久化消息通常用于發(fā)送通知以及實(shí)時(shí)數(shù)據(jù),通常要求性能優(yōu)先,消息可靠性并不是必須的情況
MQ支持可插拔式的消息存儲,如:內(nèi)存、文件和關(guān)系數(shù)據(jù)庫等方式
Queue消息模型在ActiveMQ的存儲
采用存儲采用先進(jìn)先出(FIFO),一個(gè)消息只能被一個(gè)消費(fèi)者消費(fèi),當(dāng)消息被確認(rèn)消費(fèi)之后才會被刪除。
Topic消息模型(針對持久訂閱)
每個(gè)訂閱者獲取的消息實(shí)際是消息的一個(gè)副本,只有一個(gè)消息副本會被存儲,MQ提供了一個(gè)指針來指向消息存儲并且分發(fā)消息副本到訂閱者,消息直到所有的持久化訂閱者都被接收才能被刪除。
持久化存儲方式:
KahaDB消息存儲
AMQ消息存儲
JDBC消息存儲
內(nèi)存消息存儲
KahaDB是從ActiveMQ 5.4開始默認(rèn)的持久化插件。KahaDb恢復(fù)時(shí)間遠(yuǎn)遠(yuǎn)小于其前身AMQ并且使用更少的數(shù)據(jù)文件,所以可以完全代替AMQ,kahaDB的持久化機(jī)制同樣是基于日志文件,索引和緩存。
(一)、KahaDB主要特性:
日志形式存儲消息;
消息索引以B-Tree結(jié)構(gòu)存儲,可以快速更新;
完全支持JMS事務(wù);
支持多種恢復(fù)機(jī)制;
(二)、適用場景:
高吞吐量的應(yīng)用程序
存儲大數(shù)據(jù)量的消息
(三)、配置方式 conf/activemq.xml:
(四)、KahaDB存儲原理:
當(dāng)有活動消費(fèi)者時(shí),用于臨時(shí)存儲,消息會被發(fā)送給消費(fèi)著,同時(shí)被安排將被存儲,如果消息及時(shí)被確認(rèn),就不需要寫入到磁盤。寫入到磁盤中的數(shù)據(jù)消息,在后續(xù)的消息活動中,如果消息發(fā)送成功,變標(biāo)記為可刪除的。系統(tǒng)會周期性的清除或者歸檔日志文件。
1、KahaDB內(nèi)部結(jié)構(gòu)
Data logs:消息日志包含了消息日志和一些命令
Cache:當(dāng)有活動消費(fèi)者時(shí),用于臨時(shí)存儲,消息會被發(fā)送給消費(fèi)著,同時(shí)被安排將被存儲,如果消息及時(shí)被確認(rèn),這不需要寫入到磁盤
Btree indexes(消息索引):用于引用消息日志(message id),它存儲在內(nèi)存中,這樣能快速定位到。MQ會定期將內(nèi)存中的消息索引保存到metadata store中,避免大量消息未發(fā)送時(shí),消息索引占用過多內(nèi)存空間。
Redo log用于在非正常關(guān)機(jī)情況下維護(hù)索引完整性。
2、目錄結(jié)構(gòu):
Db log files:用于存儲消息(默認(rèn)大小32M),當(dāng)log日志滿了,會創(chuàng)建一個(gè)新的,當(dāng)log日志中的消息都被刪除,該日志文件會被刪除或者歸檔。
Archive directory:當(dāng)datalog不在被kahadb需要會被歸檔(通過archiveDataLogs屬性控制)。
Db.data:存放Btree indexs。
Db.redo:存放redo file,用于恢復(fù)Btree indexs。
寫入消息時(shí),會將消息寫入日志文件,由于是順序追加寫,性能很高。為了提升性能,創(chuàng)建消息主鍵索引,并且提供緩存機(jī)制,進(jìn)一步提升性能。每個(gè)日志文件的大小都是有限制的(默認(rèn)32m,可自行配置)。當(dāng)超過這個(gè)大小,系統(tǒng)會重新建立一個(gè)文件。當(dāng)所有的消息都消費(fèi)完成,系統(tǒng)會刪除這個(gè)文件或者歸檔(取決于配置)。主要的缺點(diǎn)是AMQ Message會為每一個(gè)Destination創(chuàng)建一個(gè)索引,如果使用了大量的Queue,索引文件的大小會占用很多磁盤空間。而且由于索引巨大,一旦Broker崩潰,重建索引的速度會非常慢。
特點(diǎn):類似KahaDB,也包含了事務(wù)日志,每個(gè)destination都包含一個(gè)index文件,AMQ適用于高吞吐量的應(yīng)用場景,但是不適合多個(gè)隊(duì)列的場景。
配置方式conf/activemq.xml:
1、AMQ內(nèi)部結(jié)構(gòu):
Data logs:消息日志包含了消息日志
Cache:用于消息的快速檢索
Reference store indexes:用于引用datalogs中的消息,通過message ID 關(guān)聯(lián)
2、目錄結(jié)構(gòu):
Lock:保證同一時(shí)間只有一個(gè)borker訪問文件目錄
temp-storag:用于存儲非持久化消息(當(dāng)不在被存儲在內(nèi)存中),如等待慢消費(fèi)者處理消息
Kr-store:用于存儲引用消息日志數(shù)據(jù)
journal directory:包含了消息文件、消息日志和消息控制信息
Archive:歸檔的數(shù)據(jù)日志
支持通過JDBC將消息存儲到關(guān)系數(shù)據(jù)庫,性能上不如文件存儲,能通過關(guān)系型數(shù)據(jù)庫查詢到消息的信息。
MQ支持的數(shù)據(jù)庫:Apache Derby、MySQL、PostgreSQL、Oracle、SQLServer、Sybase、Informix、MaxDB。
存儲表結(jié)構(gòu):
A、ACTIVEMQ_MSGS:用于存儲消息,Queue和Topic都存儲在這個(gè)表中:
ID:自增的數(shù)據(jù)庫主鍵
CONTAINER:消息的Destination
MSGID_PROD:消息發(fā)送者客戶端的主鍵
MSG_SEQ:是發(fā)送消息的順序,MSGID_PROD+MSG_SEQ可以組成JMS的MessageID
EXPIRATION:消息的過期時(shí)間,存儲的是從1970-01-01到現(xiàn)在的毫秒數(shù)
MSG:消息本體的Java序列化對象的二進(jìn)制數(shù)據(jù)
PRIORITY:優(yōu)先級,從0-9,數(shù)值越大優(yōu)先級越高
B、ACTIVEMQ_ACKS:用于存儲訂閱關(guān)系。如果是持久化Topic,訂閱者和服務(wù)器的訂閱關(guān)系在這個(gè)表保存:
主要的數(shù)據(jù)庫字段如下:
CONTAINER:消息的Destination
SUB_DEST:如果是使用Static集群,這個(gè)字段會有集群其他系統(tǒng)的信息
CLIENT_ID:每個(gè)訂閱者都必須有一個(gè)唯一的客戶端ID用以區(qū)分
SUB_NAME:訂閱者名稱
SELECTOR:選擇器,可以選擇只消費(fèi)滿足條件的消息。條件可以用自定義屬性實(shí)現(xiàn),可支持多屬性AND和OR操作
LAST_ACKED_ID:記錄消費(fèi)過的消息的ID。
C、ACTIVEMQ_LOCK(消息鎖,保證同一時(shí)間只能有一個(gè)broker訪問這些表結(jié)構(gòu)):
表activemq_lock在集群環(huán)境中才有用,只有一個(gè)Broker可以獲得消息,稱為Master Broker,其他的只能作為備份等待Master Broker不可用,才可能成為下一個(gè)Master Broker。這個(gè)表用于記錄哪個(gè)Broker是當(dāng)前的Master Broker。
配置方式:
1、配置數(shù)據(jù)源 conf/acticvemq.xml文件:
2、配置broke中的persistenceAdapter :
dataSource指定持久化數(shù)據(jù)庫的bean,createTablesOnStartup是否在啟動的時(shí)候創(chuàng)建數(shù)據(jù)表,默認(rèn)值是true,這樣每次啟動都會去創(chuàng)建數(shù)據(jù)表了,一般是第一次啟動的時(shí)候設(shè)置為true,之后改成false。
ps:數(shù)據(jù)庫activemq 需要手動創(chuàng)建。
內(nèi)存消息存儲,會將所有的持久化消息存儲在內(nèi)存中,必須注意JVM使用情況以及內(nèi)存限制,適用于一些能快速消費(fèi)的數(shù)據(jù)量不大的小消息,當(dāng)MQ關(guān)閉或者宕機(jī),未被消費(fèi)的內(nèi)存消息會被清空。
配置方式 設(shè)置 broker屬性值 persistent="false":