分布式消息通信ActiveMQ原理-持久化策略-笔记
生活随笔
收集整理的這篇文章主要介紹了
分布式消息通信ActiveMQ原理-持久化策略-笔记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
消息的持久化策略分析
- 消息持久性對于可靠消息傳遞來說是一種比較好的方法,
- 即時發送者和接受者不是同時在線或者消息中心在發送者發送消息后宕機了,在消息中心重啟后仍然可以將消息發送出去。
- 消息持久性的原理很簡單,
- 就是在發送消息出去后,消息中心首先將消息存儲在本地文件、內存或者遠程數據庫,
- 然后把消息發送給接受者,
- 發送成功后再把消息從存儲中刪除,失敗則繼續嘗試。
- 接下來我們來了解一下消息在broker上的持久化存儲實現方式
持久化存儲支持類型
- ActiveMQ支持多種不同的持久化方式,主要有以下幾種,不過,無論使用哪種持久化方式,消息的存儲邏輯都是一致的。
- ? KahaDB存儲(默認存儲方式)
- ? JDBC存儲
- ? Memory存儲
- ? LevelDB存儲
- ? JDBC With ActiveMQ Journal
KahaDB存儲
- KahaDB是目前默認的存儲方式,可用于任何場景,提高了性能和恢復能力。
- 消息存儲使用一個事務日志和僅僅用一個索引文件來存儲它所有的地址。
- KahaDB是一個專門針對消息持久化的解決方案,它對典型的消息使用模式進行了優化。
- 在Kaha中,數據被追加到data logs中。
- 當不再需要log文件中的數據的時候,log文件會被丟棄。
KahaDB的配置方式
<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>KahaDB的存儲原理
- 在data/kahadb這個目錄下,會生成四個文件:
? db.data 它是消息的索引文件,本質上是B-Tree(B樹),使用B-Tree作為索引指向db-*.log里面存儲的消息
? db.redo 用來進行消息恢復
? db-*.log 存儲消息內容。
- 新的數據以APPEND的方式追加到日志文件末尾。
- 屬于順序寫入,因此消息存儲是比較快的。
- 默認是32M,達到閥值會自動遞增
? lock文件 鎖,表示當前獲得kahadb讀寫權限的broker
JDBC存儲
- 使用JDBC持久化方式,數據庫會創建3個表:activemq_msgs,activemq_acks和activemq_lock。
- ACTIVEMQ_MSGS 消息表,queue和topic都存在這個表中
- ACTIVEMQ_ACKS 存儲持久訂閱的信息和最后一個持久訂閱接收的消息ID
- ACTIVEMQ_LOCKS 鎖表,用來確保某一時刻,只能有一個ActiveMQ broker實例來訪問數據庫
JDBC存儲實踐
<persistenceAdapter> <jdbcPersistenceAdapter dataSource="# MySQL-DS " createTablesOnStartup="true" /> </persistenceAdapter>- dataSource指定持久化數據庫的bean,
- createTablesOnStartup是否在啟動的時候創建數據表,默認值是true,
- 這樣每次啟動都會去創建數據表了,
- 一般是第一次啟動的時候設置為true,之后改成false
Mysql持久化Bean配置
<bean id="Mysql-DS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://192.168.11.156:3306/activemq?relaxAutoCommit=true"/><property name="username" value="root"/><property name="password" value="root"/> </bean>添加Jar包依賴
LevelDB存儲
- LevelDB持久化性能高于KahaDB,雖然目前默認的持久化方式仍然是KahaDB。
- 并且,在ActiveMQ 5.9版本提供了基于LevelDB和Zookeeper的數據復制方式,用于Master-slave方式的首選數據復制方案。
- 不過,據ActiveMQ官網對LevelDB的表述:LevelDB官方建議使用以及不再支持,推薦使用的是KahaDB
Memory 消息存儲
- 基于內存的消息存儲,內存消息存儲主要是存儲所有的持久化的消息在內存中。
- persistent=”false”,表示不設置持久化存儲,直接存儲到內存中
JDBC Message store with ActiveMQ Journal
- 這種方式克服了JDBC Store的不足,JDBC每次消息過來,都需要去寫庫和讀庫。
- ActiveMQ Journal,使用高速緩存寫入技術,大大提高了性能。
- 當消費者的消費速度能夠及時跟上生產者消息的生產速度時,journal文件能夠大大減少需要寫入到DB中的消息。
- 舉個例子,生產者生產了1000條消息,這1000條消息會保存到journal文件,
- 如果消費者的消費速度很快的情況下,在journal文件還沒有同步到DB之前,消費者已經消費了90%的以上的消息,
- 那么這個時候只需要同步剩余的10%的消息到DB。
- 如果消費者的消費速度很慢,這個時候journal文件可以使消息以批量方式寫到DB。
- ? 將原來的標簽注釋掉
- ? 添加如下標簽
- ? 在服務端循環發送消息。可以看到數據是延遲同步到數據庫的
轉載于:https://my.oschina.net/u/3847203/blog/2989537
總結
以上是生活随笔為你收集整理的分布式消息通信ActiveMQ原理-持久化策略-笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用R语言做数据清理
- 下一篇: 写给自己的2019年规划