Activemq 訊息的儲存和持久化

2021-10-05 20:00:42 字數 2896 閱讀 8379

activemq 的訊息儲存持久化:

什麼是可持久化:

為了避免意外宕機丟失資訊,需要做到重啟後可以恢復訊息佇列。訊息系統一般都會採用持久化機制。activemq 的訊息持久化機制有 jdbc amq kahadb 和 leveldb ,無論使用哪種持久化方式,訊息的儲存邏輯是一致的。

就是傳送者訊息傳送後,訊息中心首先將訊息儲存在本地資料檔案,記憶體資料庫或遠端資料庫等 再試圖將訊息傳送給接收者,成功則將訊息從儲存中刪除,失敗則嘗試傳送。

訊息中心啟動以後首先要檢查指定的儲存位置,如果有未傳送的訊息,則需要把訊息傳送出去。

持久化儲存方式:

儲存方式

說明amq message store

基於檔案的儲存方式,是以前的預設訊息儲存,現在不用了(5.3之前的版本)

kahadb(訊息儲存,預設)

基於日誌檔案,從activemq 5.4 開始預設的持久化外掛程式

jdbc 訊息儲存

基於第三方資料庫的訊息儲存

leveldb 訊息儲存

未成熟jdbc message store with activemq journal

jdbc 訊息儲存的公升級版,解決了讀寫效能的問題

kahadb

預設的訊息持久化儲存方式。在activemq.xml中的配置如下:

"$/kahadb"

/>

<

/persistenceadapter>

kahadb 儲存原理:

db - .log : kahadb 儲存訊息到預定義大小的資料記錄檔案中,檔案命名為 db.log。當檔案已滿時,乙個新的檔案會隨之建立,number 數值也會隨之遞增,當不再有引用到資料檔案中的任何訊息時,檔案會被刪除歸檔。

db.data 該檔案包含了持久化的btree 索引,索引了訊息資料記錄的訊息,它是訊息的索引檔案,本質上是b-tree,使用b - tree 作為索引指向 db - .log 裡面儲存的訊息。

db.free 當前 db.data 檔案有哪些頁面是空閒的,檔案具體內容是所有空閒頁的id。

db.redo 用來進行訊息恢復,如果kahadb 訊息儲存在強制退出後啟動,用於恢復btree 索引。

lock 檔案鎖,表示當前獲得 kahadb 讀寫許可權的 borker 。

leveldb

未成熟jdbc 訊息儲存

使用第三方資料庫進行訊息的儲存。

具體步驟:

將資料庫驅動包,新增到 lib 資料夾下。

jdbc 配置:

"#jymmysql"

/>

<

/persistenceadapter>

datasource : 指定將要引用的持久化資料庫的bean 名稱,createtableonstartup 是否在啟動的時候建立資料表,預設值是true。這樣每次啟動都會去建立資料表了。一般是第一次啟動設定為true,之後設定為false。

配置bean

"jymmysql"

class

="org.apache.commons.dbcp2.basicdatasource" destroy-method=

"close"

>

"driverclassname" value=

"com.mysql.jdbc.driver"

/>

"url" value=

"jdbc:mysql:"

/>

"username" value=

"root"

/>

"password" value=

"admin"

/>

"poolpreparedstatements" value=

"true"

/>

<

/bean>

資料庫中新建 activemq 資料庫

啟動 activemq 就會自動在activemq 庫中建立三張表.

jdbc儲存在點對點(queue) 型別中:

當 deliverymode 設定為 deliverymode.persistent 時,會儲存在資料庫(activemq_msgs)中。

當 deliverymode 設定為 deliverymode.non_persistent 時,會儲存在記憶體中。

並且訊息一旦被消費,就會從 borker 中刪除

topic 型別中:

先啟動消費者訂閱 然後再生產的情況下 將訊息儲存到 activemq_acks。

jdbc with journal(高效能)

修改配置檔案:

<

!--訊息儲存持久化jdbc message store with activemq journal--

>

journallogfiles=

"4"

journallogfilesize=

"32768"

usejournal=

"true"

usequickjournal=

"true"

datasource=

"#jymmysql"

datadirectory=

"activemq-data"

/>

<

/persistencefactory>

這種方式克服了 jdbc store 的不足,jdbc 每次訊息過來,都需要去寫庫和讀庫。

activemq journal 使用快取記憶體技術寫入技術,大大提高了效能。

當消費者的消費速度能夠及時跟上生產者訊息的生產速度時,journal 檔案就能大大減少 db 中的訊息。

學習年限不足,知識過淺,說的不對請見諒。

ActiveMQ 訊息儲存

理解 activemq 儲存訊息的儲存機制的基本知識是非常重要的。佇列和主題中的訊息儲存是不同的,因為有些可以在主題上優化的地方並不適合佇列。佇列儲存訊息是非常直接的 即最基本的先進先出 fifo 主題儲存訊息是有點複雜的,它為每乙個消費者維持乙個指向訊息佇列的指標。自從 5.3 版本之後,acti...

ActiveMQ的訊息儲存方式

1.佇列儲存 採取先進先出模式,同一時間,訊息只會傳送給某乙個消費者,只有當該訊息被消費並告知已收到時,它才能在 的儲存中被刪除。對於永續性訂閱來說,每乙個消費者都會獲取訊息的拷貝。為了節約空間,的儲存介質中只儲存了乙份訊息,儲存介質的持久訂閱物件為其以後的被儲存的訊息維護了乙個指標,消費者消費時,...

activemq的高階特性 訊息儲存持久化

activemq的高階特性之訊息儲存持久化 有基於檔案的,資料庫的,記憶體的。預設的是基於檔案的,在安裝目錄 data kahadb。在conf activemq.xml檔案中。把儲存持久化換成mysql的資料庫。1 修改配置檔案 在標籤後面新增 relaxautocommit true useun...