個人博客網:https://wushaopei.github.io/ (你想要這里多有)
一、持久化機制
1、Activemq持久化
1.1 什么是持久化:
1.2 持久化的作用
詳情——官網 : http://activemq.apache.org/persistence
1.3 ActiveMQ 支持的消息持久化機制:
- 為了避免意外宕機以后丟失信息,需要做到重啟后可以恢復消息隊列,消息系統一半都會采用持久化機制。
- ActiveMQ的消息持久化機制有JDBC,AMQ,KahaDB和LevelDB,無論使用哪種持久化方式,消息的存儲邏輯都是一致的。
- 就是在發送者將消息發送出去后,消息中心首先將消息存儲到本地數據文件、內存數據庫或者遠程數據庫等。再試圖將消息發給接收者,成功則將消息從存儲中刪除,失敗則繼續嘗試嘗試發送。
- 消息中心啟動以后,要先檢查指定的存儲位置是否有未成功發送的消息,如果有,則會先把存儲位置中的消息發出去。
注意:一句話:ActiveMQ宕機了,消息不會丟失的機制。
二、持久化方式
1、Activemq的持久化方式有幾種
1.1 AMQ Mesage Store(了解)
注意:基於文件的存儲方式,是以前的默認消息存儲,現在不用了
1.2 KahaDB消息存儲(默認)
KahaDB 的屬性配置 : http://activemq.apache.org/kahadb
說明:它使用一個事務日志和 索引文件來存儲所有的地址
1.3 JDBC消息存儲
1.4 LevelDB消息存儲(了解)
它比KahaDB 更快的原因是她不使用BTree 索引,而是使用本身自帶的 LeavelDB 索引
這種文件系統是從ActiveMQ5.8之后引進的,它和KahaDB非常相似,也是基於文件的本地數據庫存儲形式,但是它提供比KahaDB更快的持久性。
但它不使用自定義B-Tree實現來索引獨寫日志,而是使用基於LevelDB的索引
題外話:為什么LeavelDB 更快,並且5.8 以后就支持,為什么還是默認 KahaDB 引擎,因為 activemq 官網本身沒有定論,LeavelDB 之后又出了可復制的LeavelDB 比LeavelDB 更性能更優越,但需要基於 Zookeeper 所以這些官方還沒有定論,任就使用 KahaDB
默認配置如下:
1.5 JDBC Message Store with ActiveMQ Journal
2、JDBC存儲消息(重點)
①修改配置文件,默認 kahaDB
修改之前:
修改之后:
②在activemq 的lib 目錄下添加 jdbc 的jar 包 (connector.jar 我使用5.1.41 版本)
③ 修改配置文件 : activemq.xml 使其連接自己windows 上的數據庫,並在本地創建名為activemq 的數據庫
④ 讓linux 上activemq 可以訪問到 mysql ,之后產生消息。
ActiveMQ 啟動后會自動在 mysql 的activemq 數據庫下創建三張表:activemq_msgs 、activemq_acks、activemq_lock
點對點會在數據庫的數據表 ACTIVEMQ_MSGS 中加入消息的數據,且在點對點時,消息被消費就會從數據庫中刪除
但是對於主題,訂閱方式接受到的消息,會在 ACTIVEMQ_MSGS 存儲消息,即使MQ 服務器下線,並在 ACTIVEMQ_ACKS 中存儲消費者信息 。 並且存儲以 activemq 為主,當activemq 中的消息被刪除后,數據庫中的也會自動被刪除。
如果表沒生成,可能需要自己創建
坑:
JDBC 改進: 加入高速緩存機制 Journal
高速緩存在 activemq.xml 中的配置:
⑤代碼運行驗證
一定要開啟持久化 : messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
(1)隊列Queue:
生產者:
運行結果:
在點對點類型中
- 當DeliveryMode設置為NON_PERSISTENCE時,消息被保存在內存中
- 當DeliveryMode設置為PERSISTENCE時,消息保存在broker的相應的文件或者數據庫中。
而且點對點類型中消息一旦被Consumer消費,就從數據中刪除
消費前的消息,會被存放到數據庫
上面的消息被消費后被MQ自動刪除
(2)主題Topic
在點對點類型中
- 當DeliveryMode設置為NON_PERSISTENCE時,消息被保存在內存中
- 當DeliveryMode設置為PERSISTENCE時,消息保存在broker的相應的文件或者數據庫中。
而且點對點類型中消息一旦被Consumer消費,就從數據中刪除
消費前的消息,會被存放到數據庫
上面的消息被消費后被MQ自動刪除
3、JDBC Message store with ActiveMQ Journal(重點)
3.1 定義:
3.2 說明
這種方式克服了JDBC Store的不足,JDBC每次消息過來,都需要去寫庫讀庫。
ActiveMQ Journal,使用高速緩存寫入技術,大大提高了性能。
當消費者的速度能夠及時跟上生產者消息的生產速度時,journal文件能夠大大減少需要寫入到DB中的消息。
舉個例子:
生產者生產了1000條消息,這1000條消息會保存到journal文件,如果消費者的消費速度很快的情況下,在journal文件還沒有同步到DB之前,消費者已經消費了90%的以上消息,那么這個時候只需要同步剩余的10%的消息到DB。如果消費者的速度很慢,這個時候journal文件可以使消息以批量方式寫到DB。
3.3 配置方式:
原來的配置:
修改的結果:
以前是實時寫入mysql,在使用了journal后,數據會被journal處理,如果在一定時間內journal處理(消費)完了,就不寫入mysql,如果沒消費完,就寫入mysql,起到一個緩存的作用
小總結:
- 持久化消息是指:
- MQ 所在的服務器down 了消息也不會丟失
2.持久化機制演化過程:
- 從最初的AMQ Message Store 方案到 ActiveMQ V4版本推出的High performance journal (高性能事務)附件,並且同步推出了關系型數據庫的存儲方案, ActiveMQ 5.3 版本有推出了KahaDB 的支持,(也是5.4之后的默認持久化方案),后來ActiveMQ 從5.8開始支持LevelDB ,現在5.9 提供了 Zookeeper + LevelDB 的集群化方案。
3. ActiveMQ 消息持久化機制有:
AMQ | 基於日志文件 |
KahaDB | 基於日志文件,5.4 之后的默認持久化 |
JDBC | 基於第三方數據庫 |
LevelDB | 基於文件的本地數據庫存儲,從5.8 之后推出了LevelDB 性能高於 KahaDB |
ReplicatedLevelDB Store | 從5.8之后提供了基於LevelDB 和Zookeeper 的數據復制方式,用於Master-slave方式的首數據復制選方案 但是無論使用哪種持久化方式,消息的存儲邏輯都一樣 |