柚子快報(bào)激活碼778899分享:ActiveMq學(xué)習(xí)⑧
柚子快報(bào)激活碼778899分享:ActiveMq學(xué)習(xí)⑧
ActiveMQ的消息存儲(chǔ)和持久化
MQ的高可用
事務(wù)持久簽收可持久化 (類(lèi)似于與mq消息的同步機(jī)制)
為了避免意外宕機(jī)以后丟失信息,需要做到重啟后可以恢復(fù)消息隊(duì)列,消息系統(tǒng)一半都會(huì)采用持久化機(jī)制。
ActiveMQ的消息持久化機(jī)制
ActiveMQ的消息持久化機(jī)制有
JDBCAMQKahaDBLevelDB無(wú)論使用哪種持久化方式,消息的存儲(chǔ)邏輯都是一致的。 邏輯
就是在發(fā)送者將消息發(fā)送出去后消息中心首先將消息存儲(chǔ)到本地?cái)?shù)據(jù)文件、內(nèi)存數(shù)據(jù)庫(kù)或者遠(yuǎn)程數(shù)據(jù)庫(kù)等。再試圖將消息發(fā)給接收者成功則將消息從存儲(chǔ)中刪除,失敗則繼續(xù)嘗試嘗試發(fā)送。
消息中心啟動(dòng)以后,要先檢查指定的存儲(chǔ)位置是否有未成功發(fā)送的消息,如果有,則會(huì)先把存儲(chǔ)位置中的消息發(fā)出去。
官網(wǎng)
ActiveMQ的消息持久化機(jī)制有哪些?
AMQ Message Store
基于文件的存儲(chǔ)方式,是以前的默認(rèn)消息存儲(chǔ),現(xiàn)在不用了。具有寫(xiě)入速度快和容易恢復(fù)的特點(diǎn)消息存儲(chǔ)在一個(gè)個(gè)文件中,文件默認(rèn)大小為32M,當(dāng)一個(gè)存儲(chǔ)文件中的消息已經(jīng)全部被消費(fèi),那么這個(gè)文件將被標(biāo)識(shí)為可刪除,在下一個(gè)清楚階段買(mǎi)這個(gè)文件可刪除AMQ適用于ActiveMQ5.3之前的版本 KahaDB (默認(rèn))
基于日志文件,從ActiveMQ5.4開(kāi)始默認(rèn)的持久化插件,我們從配置文件 activemq.xml 中可以看到 KahaDB是一個(gè)基于文件的持久性數(shù)據(jù)庫(kù),它是使用它的消息代理的本地?cái)?shù)據(jù)庫(kù)。
db-.log 為 kahaDB 存儲(chǔ)消息的數(shù)據(jù)記錄文件,文件大小限定32M,大于32M就會(huì)遞增下一個(gè)數(shù)據(jù)文件,比如:log-2.log、log-3.log 以此類(lèi)推。當(dāng)不再引用數(shù)據(jù)文件中的任何消息時(shí),文件就會(huì)被刪除或歸檔。db.data 文件包含了持久化的 BTree 索引,是消息的索引文件,本質(zhì)上是 B-Tree 樹(shù),使用 B-Tree 作為索引指向 db-.log 里面存儲(chǔ)的消息。 db.free 記錄 db.data 文件中哪些頁(yè)面是空閑的,后面建索引則優(yōu)先從空閑頁(yè)中創(chuàng)建。文件的具體內(nèi)容是所有空閑頁(yè)的IDdb.redo 用來(lái)進(jìn)行消息恢復(fù),如果KahaDB消息存儲(chǔ)在強(qiáng)制退出后啟動(dòng),用于恢復(fù)BTree索引lock 文件為文件鎖,表示當(dāng)前獲得 kahaDB 讀寫(xiě)權(quán)限的 broker 它已經(jīng)針對(duì)快速持久性進(jìn)行了優(yōu)化。它是自ActiveMQ 5.4以來(lái)的默認(rèn)存儲(chǔ)機(jī)制。KahaDB比其前身AMQ消息存儲(chǔ)使用更少的文件描述符,并提供更快的恢復(fù) LevelDB消息存儲(chǔ)
從 ActiveMQ 5.8 之后引進(jìn)的,和 KahaDB 非常相似基于文件的本地?cái)?shù)據(jù)存儲(chǔ)形式,但是它提供比 KahaDB 更快的持久性。雖然還不是默認(rèn)的消息存儲(chǔ),但我們希望此存儲(chǔ)實(shí)現(xiàn)在未來(lái)的版本中成為默認(rèn)的。但它不適用自定義 B-Tree 實(shí)現(xiàn)來(lái)索引預(yù)寫(xiě)日志,而是使用基于 LevelDB 的索引。要使用 LevelDB 需要修改配置文件為:
JDBC消息存儲(chǔ)
原理圖 添加mysql數(shù)據(jù)庫(kù)的驅(qū)動(dòng)包到lib文件夾 jdbcPersistenceAdapter配置 數(shù)據(jù)庫(kù)連接池配置 建倉(cāng)sql和建表說(shuō)明
ACTIVEMQ_MSGS queue和topic都存儲(chǔ)在里面 ACTIVEMQ_ACKS 存儲(chǔ)持久訂閱的信息和最后一個(gè)持久訂閱接收的消息ID ACTIVEMQ_LOCK 表ACTIVEMQ_LOCK在集群環(huán)境下才有用,只有一個(gè)Broker可以獲取消息,稱(chēng)為Master Broker,其他的只能作為備份等待Master Broker不可用,才可能成為下一個(gè)Master Broker。這個(gè)表用于記錄哪個(gè)Broker是當(dāng)前的Master Broker 驗(yàn)證和數(shù)據(jù)表變化
下面我先以 queue 為例,想要消息保存到數(shù)據(jù)庫(kù)生效,必須在創(chuàng)建消息生產(chǎn)者的時(shí)候開(kāi)啟持久化模式(消費(fèi)者無(wú)需改寫(xiě)代碼): 這樣,當(dāng)生產(chǎn)者發(fā)送消息成功后就可以在數(shù)據(jù)庫(kù)中的 activemq_msgs 表看到相應(yīng)的數(shù)據(jù)了。而當(dāng)消費(fèi)者消費(fèi)消息之后,數(shù)據(jù)庫(kù)的相應(yīng)記錄就會(huì)被刪除。 點(diǎn)到點(diǎn)(queue)
在點(diǎn)對(duì)點(diǎn)類(lèi)型中當(dāng)DeliveryMode設(shè)置為NON_PERSISTENCE時(shí),消息被保存在內(nèi)存中當(dāng)DeliveryMode設(shè)置為PERSISTENCE時(shí),消息保存在broker的相應(yīng)的文件或者數(shù)據(jù)庫(kù)中。而且點(diǎn)對(duì)點(diǎn)類(lèi)型中消息一旦被Consumer消費(fèi),就從數(shù)據(jù)中刪除 發(fā)布/訂閱(topic)
設(shè)置了持久訂閱數(shù)據(jù)庫(kù)里面會(huì)保存訂閱者的信息我們先啟動(dòng)一下持久化topic 的消費(fèi)者??吹紸CTIVEMQ_ACKS 數(shù)據(jù)表多了一條消息。LAST_ACKED_ID記錄了CLIENT_ID最后簽收的一條消息. 我們啟動(dòng)持久化生產(chǎn)6條數(shù)據(jù),ACTIVE_MSGS數(shù)據(jù)表新增6條數(shù)據(jù),消費(fèi)者消費(fèi)所有的數(shù)據(jù)后,表里的數(shù)據(jù)并沒(méi)有消失。持久化的topic的消息不管是否被消費(fèi),是否有消費(fèi)者,產(chǎn)生的數(shù)據(jù)永遠(yuǎn)存在且只存儲(chǔ)一條。需要注意,持久化topic數(shù)據(jù)量太大會(huì)導(dǎo)致性能下降。 JDBC Message store with ActiveMQ Journal
這種方式克服了 JDBC 存儲(chǔ)的不足:JDBC 每次消息過(guò)來(lái),都要去讀寫(xiě)數(shù)據(jù)庫(kù),比較消耗性能,所以引進(jìn)了 ActiveMQ Journal,使用高速緩存寫(xiě)入技術(shù),大大提高了性能要使用 ActiveMQ Journa 的話,需要修改配置文件,把持久化工廠修改為如下 當(dāng)消費(fèi)者的速度能夠及時(shí)跟上生產(chǎn)者消息的生產(chǎn)速度時(shí),journal文件能夠大大減少需要寫(xiě)入到DB中的消息。 舉個(gè)例子:生產(chǎn)者生產(chǎn)了1000條消息,這1000條消息會(huì)保存到j(luò)ournal文件,如果消費(fèi)者的消費(fèi)速度很快的情況下,在journal文件還沒(méi)有同步到DB之前,消費(fèi)者已經(jīng)消費(fèi)了90%的以上消息,那么這個(gè)時(shí)候只需要同步剩余的10%的消息到DB。如果消費(fèi)者的速度很慢,這個(gè)時(shí)候journal文件可以使消息以批量方式寫(xiě)到DB??偨Y(jié): 以前是實(shí)時(shí)寫(xiě)入mysql,在使用了journal后,數(shù)據(jù)會(huì)被journal處理,如果在一定時(shí)間內(nèi)journal處理(消費(fèi))完了,就不寫(xiě)入mysql,如果沒(méi)消費(fèi)完,就寫(xiě)入mysql,起到一個(gè)緩存的作用。在慢慢的同步數(shù)據(jù)庫(kù) 持久化總結(jié)
柚子快報(bào)激活碼778899分享:ActiveMq學(xué)習(xí)⑧
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。