ActiveMQ 中的訊息持久化(一)
為了防止系統意外down機丟失訊息,同時能在系統恢復後能重新傳送原來未傳送的訊息。一般訊息系統都會採用持久化機制。Activemq5.4提供了幾種持久化機制:
1、KahaDB message store
2、Journaled JDBC adapter
3、Non-journaled JDBC adapter
為了保持後向相容性,Activemq5.4同樣提供以前版本中的持久化機制。例如:AMQ message store以及 Kaha persistence adapter。5.4中預設的採用KahaDB,KahaDB是一種可嵌入式的事務性的持久化機制。要啟用或禁用持久化可以通過配置檔案中的broker標籤中的persistent屬性設定
true : 啟用持久化
false : 禁用持久化,即便是在配置檔案中配置了persistence adapter。
修改配置檔案中的persistenceAdapter或者persistenceFactory可以修改Activemq提供的預設機制。具體可以檢視後面的配置檔案。
下面詳細介紹KahaDB,主要特性有:
1、日誌形式儲存訊息。
2、訊息索引以B-Tree結構儲存,可以快速更新
3、完全支援JMS事務
4、支援多種恢復機制
下面是KahaDB的一段簡短配置:
directory : 指定持久化訊息的儲存目錄
journalMaxFileLength : 指定儲存訊息的日誌檔案大小,具體根據你的實際應用配置
上圖展示的是KahaDB的結構圖。訊息儲存在基於檔案的資料日誌中。如果訊息傳送成功,變標記為可刪除的。系統會週期性的清除或者歸檔日誌檔案。訊息檔案的位置索引儲存在記憶體中,這樣能快速定位到。定期將記憶體中的訊息索引儲存到metadata store中,避免大量訊息未傳送時,訊息索引佔用過多記憶體空間。
Data logs
資料日誌中儲存著訊息以及目的地、訂閱、事務等相關資訊。這些資訊在日誌檔案中並未按照一個特定的格式來儲存,所以就需要索引各類資訊,以便能快速定位到。
Metadata cache
在記憶體中儲存日誌檔案中各類資訊的索引,索引資訊包含一個MessageId與訊息在日誌檔案中的偏移量的對應關係。所有索引以B-Tree結構存在記憶體中,便於在一個有序的list上快速的查詢,插入以及刪除。記憶體中的訊息索引會定期的儲存到Metadata store中。具體時間週期可以設定checkpointInterval屬性。理想情況下Metadata cache越大愈好,這樣在定位訊息的時候就不盡量少的去Metadata store中獲取索引了。實際可以參考db.data檔案的大小來設定。indexCacheSize 便是設定快取的大小。
Metadata store
在db.data檔案中儲存訊息日誌中訊息的後設資料,也是以B-Tree結構儲存的,定時從Metadata cache更新資料。同時,Metadata store中也會備份一些在訊息日誌中存在的資訊,這樣可以讓Broker例項快速啟動。即便metadata store檔案被破壞或者誤刪除了。broker可以讀取Data logs恢復過來,只是速度會相對較慢些。
Metadata cache與Metadata store同步
KahaDB提供了兩種觸發同步設定
1、設定一個閥值,當Metadata cache與Metadata store中的索引不同的數量達到這個閥值時,觸發同步。indexWriteBatchSize
便是設定這個閥值。
2、設定一個時間週期,當時間週期到了後,不管Metadata cache與Metadata store是否不同,都觸發同步。
通過checkpointInterval設定一個時間週期。
通常為了達到更高的效能,會將indexWriteBatchSize值設定很大。只在到達checkpointInterval時間點時才同步。這樣做的風險就是有可能在系統意外down機時丟失部分metadata資訊。
1、KahaDB message store
2、Journaled JDBC adapter
3、Non-journaled JDBC adapter
為了保持後向相容性,Activemq5.4同樣提供以前版本中的持久化機制。例如:AMQ message store以及 Kaha persistence adapter。5.4中預設的採用KahaDB,KahaDB是一種可嵌入式的事務性的持久化機制。要啟用或禁用持久化可以通過配置檔案中的broker標籤中的persistent屬性設定
- <broker persistent="false" ...>
- ...
- </broker>
true : 啟用持久化
false : 禁用持久化,即便是在配置檔案中配置了persistence adapter。
修改配置檔案中的persistenceAdapter或者persistenceFactory可以修改Activemq提供的預設機制。具體可以檢視後面的配置檔案。
下面詳細介紹KahaDB,主要特性有:
1、日誌形式儲存訊息。
2、訊息索引以B-Tree結構儲存,可以快速更新
3、完全支援JMS事務
4、支援多種恢復機制
下面是KahaDB的一段簡短配置:
- <broker brokerName="broker" persistent="true" useShutdownHook="false">
- ...
- <persistenceAdapter>
- <kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
- </persistenceAdapter>
- </broker>
directory : 指定持久化訊息的儲存目錄
journalMaxFileLength : 指定儲存訊息的日誌檔案大小,具體根據你的實際應用配置
上圖展示的是KahaDB的結構圖。訊息儲存在基於檔案的資料日誌中。如果訊息傳送成功,變標記為可刪除的。系統會週期性的清除或者歸檔日誌檔案。訊息檔案的位置索引儲存在記憶體中,這樣能快速定位到。定期將記憶體中的訊息索引儲存到metadata store中,避免大量訊息未傳送時,訊息索引佔用過多記憶體空間。
Data logs
資料日誌中儲存著訊息以及目的地、訂閱、事務等相關資訊。這些資訊在日誌檔案中並未按照一個特定的格式來儲存,所以就需要索引各類資訊,以便能快速定位到。
Metadata cache
在記憶體中儲存日誌檔案中各類資訊的索引,索引資訊包含一個MessageId與訊息在日誌檔案中的偏移量的對應關係。所有索引以B-Tree結構存在記憶體中,便於在一個有序的list上快速的查詢,插入以及刪除。記憶體中的訊息索引會定期的儲存到Metadata store中。具體時間週期可以設定checkpointInterval屬性。理想情況下Metadata cache越大愈好,這樣在定位訊息的時候就不盡量少的去Metadata store中獲取索引了。實際可以參考db.data檔案的大小來設定。indexCacheSize 便是設定快取的大小。
Metadata store
在db.data檔案中儲存訊息日誌中訊息的後設資料,也是以B-Tree結構儲存的,定時從Metadata cache更新資料。同時,Metadata store中也會備份一些在訊息日誌中存在的資訊,這樣可以讓Broker例項快速啟動。即便metadata store檔案被破壞或者誤刪除了。broker可以讀取Data logs恢復過來,只是速度會相對較慢些。
Metadata cache與Metadata store同步
KahaDB提供了兩種觸發同步設定
1、設定一個閥值,當Metadata cache與Metadata store中的索引不同的數量達到這個閥值時,觸發同步。indexWriteBatchSize
便是設定這個閥值。
2、設定一個時間週期,當時間週期到了後,不管Metadata cache與Metadata store是否不同,都觸發同步。
通過checkpointInterval設定一個時間週期。
通常為了達到更高的效能,會將indexWriteBatchSize值設定很大。只在到達checkpointInterval時間點時才同步。這樣做的風險就是有可能在系統意外down機時丟失部分metadata資訊。
相關文章
- ActiveMQ 中的訊息持久化(二)MQ持久化
- ActiveMQ持久化訊息MQ持久化
- ActiveMQ 訊息資料持久化MQ持久化
- ActiveMQ訊息持久化機制配置注意事項MQ持久化
- RabbitMq中的訊息應答與持久化MQ持久化
- ActiveMQ持久化方式MQ持久化
- ActiveMQ-mysql持久化MQMySql持久化
- ActiveMQ 中的訊息遊標(Message cursors)MQ
- ActiveMQ支援的訊息協議MQ協議
- php ActiveMQ的傳送訊息,與處理訊息PHPMQ
- 訊息佇列之 ActiveMQ佇列MQ
- 訊息中介軟體之ActiveMQMQ
- ActiveMQ + Camel 實現訊息路由MQ路由
- 訊息佇列ActiveMQ的使用詳解佇列MQ
- 溫故之訊息佇列ActiveMQ佇列MQ
- Kafka之acks引數對訊息持久化的影響Kafka持久化
- 常見訊息中介軟體之ActiveMQMQ
- Docker學習之搭建ActiveMQ訊息服務DockerMQ
- 訊息佇列的作用以及kafka和activemq的對比佇列KafkaMQ
- rocket mq 底層儲存原始碼分析(2)-業務訊息持久化MQ原始碼持久化
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZJava佇列MQ
- 誰才是最快的訊息佇列:ActiveMQ, RabbitMQ, HornetQ, QPID佇列MQ
- Java訊息佇列總結只需一篇解決ActiveMQ、RabbitMQ、ZeroMQ、KafkaJava佇列MQKafka
- 探索AJAX中的訊息傳輸模式(一)模式
- 快速掌握RabbitMQ(三)——訊息確認、持久化、優先順序的C#實現MQ持久化C#
- iOS中的資料持久化iOS持久化
- OpenCV持久化(一)OpenCV持久化
- Activemq構建高併發、高可用的大規模訊息系統MQ
- 微信開發中的訊息驗證與訊息回覆
- 學習在.NET Core中使用RabbitMQ進行訊息傳遞之持久化(二MQ持久化
- 訊息佇列之非同步訊息的基本概念以及ActiveMQ整合Spring的常用用法介紹 | 掘金技術徵文佇列非同步MQSpring
- 訊息中介軟體部署及比較:rabbitMQ、activeMQ、zeroMQ、rocketMQ、Kafka、redisMQKafkaRedis
- 訊息佇列中的Oracle佇列Oracle
- WebRTC中的訊息機制Web
- RabbitMQ使用教程(四)如何通過持久化保證訊息99.99%不丟失?MQ持久化
- 深度解析VC中的訊息(中) (轉)
- Redis的兩種持久化方式-快照持久化(RDB)和AOF持久化Redis持久化
- Redis資料持久化—RDB持久化與AOF持久化Redis持久化