RocketMq存儲管理分析

在這裏插入圖片描述
1、生產者發送消息給mq
2、mq將消息持久化存儲到存儲系統
3、mq發送ack給生產者
4、mq將消息推送給消費者
5、消費者發送ack給mq
6、mq將消息從存儲系統中刪除

存儲介質
1、關係型數據庫DB
2、文件系統

文件系統如何保證讀寫速度
1、寫需要順序寫
2、讀需要零拷貝,Java中通過MappedByteBuffer實現零拷貝(一次只能映射1.5G-2G文件至用戶態的虛擬內存,所以RocketMq默認設置單個CommitLog日誌數據文件爲1G的原因)
在這裏插入圖片描述
零拷貝繞過了將數據拷貝到用戶態的步驟,直接將數據拷貝到網絡驅動內核

rocketMq存儲結構
在這裏插入圖片描述
1、文件存放在commitLog中(存儲消息內容,也包含consumerQueue),大小爲1G。

2、consumerQueue 消費邏輯隊列(消息索引),將其加載到內存,加快索引速度。
引入的目的主要是提高消息消費的性能,由於RocketMQ是基於主題topic的訂閱模式,消息消費是針對主題進行的,如果要遍歷commitlog文件中根據topic檢索消息是非常低效的。Consumer即可根據ConsumeQueue來查找待消費的消息。其中,ConsumeQueue(邏輯消費隊列)作爲消費消息的索引,保存了指定Topic下的隊列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。

3、IndexFile索引文件,提供了一種通過key或者實際區間來查消息的方法。

刷盤機制
同步刷盤
安全可靠的,在mq在收到生產者發送來的消息後,立即通知刷盤線程將消息刷到磁盤後,刷盤線程執行完成後喚醒等待的線程,纔會去給生產者發送ACK,確保消息已經落盤

異步刷盤
不可靠,在mq收到消息後立即給生產者發送ACK,然後啓異步線程將消息落盤。但是響應速度快,吞吐量大。當內存中的消息量達到一定程度時,同意觸發刷磁盤動作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章