AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

三分鐘白話RocketMQ系列—— 如何存儲消息

來源: 責編: 時間:2023-08-14 22:00:55 279觀看
導讀我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何存儲消息的,揭秘消息存儲全過程。注意,如果白話中不小心提到相關代碼配置與類名,請參考RocketMQ 4.9.4版本關鍵

我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。NHe28資訊網——每日最新資訊28at.com

那接下來,我們白話一下,RocketMQ是如何存儲消息的,揭秘消息存儲全過程。NHe28資訊網——每日最新資訊28at.com

注意,如果白話中不小心提到相關代碼配置與類名,請參考RocketMQ 4.9.4版本NHe28資訊網——每日最新資訊28at.com

關鍵字摘要
  • 存儲模型與存儲類型
  • 如何保證存儲消息不丟失
  • 如何提高寫入性能
  • 如何清理過期消息

存儲模型是什么?有哪些存儲類型?

RocketMQ使用了一種基于日志的存儲方式,將消息以順序寫入的方式追加到文件中,從而實現高性能的消息存儲和讀取。NHe28資訊網——每日最新資訊28at.com

RocketMQ的消息存儲方式可以分為兩個類型:CommitLog 和ConsumeQueue 。NHe28資訊網——每日最新資訊28at.com

圖片圖片NHe28資訊網——每日最新資訊28at.com

還有一個文件類型是indexfile,主要用于控制臺消息檢索,不影響消息的寫入與消費,我們就不展開了。NHe28資訊網——每日最新資訊28at.com

CommitLog

CommitLog文件存儲了Producer端寫入的消息主體內容,它以追加寫入的方式將消息存儲到磁盤上的文件中。NHe28資訊網——每日最新資訊28at.com

單個文件大小默認1G ,文件名長度為20位(左邊補零,剩余為起始偏移量),當文件滿了,寫入下一個文件。NHe28資訊網——每日最新資訊28at.com

比如00000000000000000000代表了第一個文件,起始偏移量為0,文件大小為1G=1073741824;當第一個文件寫滿了,第二個文件為00000000001073741824,起始偏移量為1073741824,以此類推。NHe28資訊網——每日最新資訊28at.com

它的主要特點是:順序寫,但是隨機讀(被ConsumeQueue讀取)。NHe28資訊網——每日最新資訊28at.com

雖然是隨機讀,但是利用package機制,可以批量地從磁盤讀取,作為cache存到內存中,加速后續的讀取速度。NHe28資訊網——每日最新資訊28at.com

Broker單個實例下所有的隊列共用一個日志數據文件CommitLog來存儲。而Kafka采用的是獨立型的存儲結構,每個隊列一個文件。NHe28資訊網——每日最新資訊28at.com

ConsumeQueue

ConsumeQueue文件是用于支持消息消費的存儲結構。保存了指定Topic下的隊列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。NHe28資訊網——每日最新資訊28at.com

消費者 通過 順序讀取 ConsumeQueue文件,可以快速定位到消息在CommitLog中的物理存儲位置,從而實現快速消息的拉取和消費。NHe28資訊網——每日最新資訊28at.com

從實際物理存儲的角度來看,每個主題Topic下的每個隊列Queue對應一個ConsumeQueue文件。NHe28資訊網——每日最新資訊28at.com

生產者端的消息是順序寫入CommitLog,消費者端是順序讀取ConsumeQueue。但是根據ConsumeQueue的起始物理位置偏移量offset讀取消息真實內容,實際是隨機讀取CommitLog。實現了 消息生產與消息消費、數據存儲和數據索引 相互分離。NHe28資訊網——每日最新資訊28at.com

怎么保證存儲消息不丟失?

刷盤機制

Broker在把消息寫入日志文件的過程中,如果在剛收到消息時,Broker異常宕機了,那么內存中尚未寫入磁盤的消息就會丟失了。NHe28資訊網——每日最新資訊28at.com

因此,RocketMQ持久化消息分為兩種:同步刷盤和異步刷盤(默認配置)。NHe28資訊網——每日最新資訊28at.com

異步刷盤是指Broker收到消息后先存儲到PageCache,然后立即通知Producer消息已存儲成功,可以繼續處理業務邏輯。此后,Broker會啟動一個異步線程將消息持久化到磁盤。然而,如果Broker在持久化到磁盤之前發生故障,消息將會丟失。NHe28資訊網——每日最新資訊28at.com

## 刷盤策略配置flushDiskType = ASYNC_FLUSH

注意,寫入PageCache后,應用服務宕機消息不丟失,只有機器斷電或宕機會有少量消息丟失。NHe28資訊網——每日最新資訊28at.com

相比之下,同步刷盤的方式是在消息存儲到緩存后不立即通知Producer,而是等待消息被持久化到磁盤后再通知Producer。這種方式確保了消息不會丟失,但性能不如異步刷盤高。一般用于金融業務。NHe28資訊網——每日最新資訊28at.com

## 刷盤策略配置flushDiskType = SYNC_FLUSH

在選擇刷盤方式時,需要根據業務場景進行權衡。NHe28資訊網——每日最新資訊28at.com

主從同步機制

即使Broker采用同步刷盤策略,但如果刷盤完成后磁盤損壞,會導致所有存儲在磁盤上的消息丟失。NHe28資訊網——每日最新資訊28at.com

即使采用了主從復制,如果主節點在刷盤完成后還沒有來得及將數據同步給從節點就發生了磁盤故障,同樣會導致數據丟失。NHe28資訊網——每日最新資訊28at.com

所以我們可以配置同步機制,等待從節點復制完成主節點的消息后,才去通知Producer完成了消息存儲。NHe28資訊網——每日最新資訊28at.com

## 主從同步策略配置brokerRole=SYNC_MASTER

怎么提高存儲寫入性能?

零拷貝技術

RocketMQ通過使用內存映射文件(包括CommitLog、 ConsumeQueue等文件)來提高IO訪問性能,也就是我們常說的零拷貝技術。NHe28資訊網——每日最新資訊28at.com

Java在NIO包里,引入了sendFile(FileChannel類)和MMAP(MappedByteBuffer類)兩種實現方式的零拷貝技術。NHe28資訊網——每日最新資訊28at.com

主流的MQ都會使用零拷貝技術,來提升IO:NHe28資訊網——每日最新資訊28at.com

  • Kafka:record 的讀和寫都是基于 FileChannel。index 的讀寫則基于 MMAP。
  • RocketMQ:讀取數據基于 MMAP,寫入數據默認使用 MMAP。但可以通過修改配置transientStorePoolEnable參數將其配置為使用 FileChannel。作者之所以這樣設計,是為了避免 PageCache 的鎖競爭,并通過兩層架構實現讀寫分離。

緩沖池寫入增強

在不開啟RocketMQ的內存映射增強方案時,RocketMQ的讀和寫都只會簡單直接使用MMAP。NHe28資訊網——每日最新資訊28at.com

但是,MappedByteBuffer也存在一些缺陷:NHe28資訊網——每日最新資訊28at.com

  • 使用虛擬內存,超過物理內存會導致內存交換,引起磁盤IO(可能非順序IO)速度較慢。
  • 虛擬內存交換是受操作系統控制的,所以其他進程活動也會觸發RocketMQ內存映射的交換。
  • 文件內存映射寫入PageCache時存在鎖競爭,直接寫入內存可避免競爭,在異步刷盤場景下速度更快。

為此,RocketMQ通過transientStorePoolEnable參數控制,對寫入進行了優化。NHe28資訊網——每日最新資訊28at.com

如果開啟了這個參數,會將寫入拆分為兩步, 寫入緩沖區 + 異步刷盤 的增強策略。NHe28資訊網——每日最新資訊28at.com

## 刷盤策略配置flushDiskType = ASYNC_FLUSH transientStorePoolEnable = true

MappedFile會提前申請一塊直接內存用作緩沖區,放棄使用mmap直接寫文件。NHe28資訊網——每日最新資訊28at.com

數據先寫入緩沖區,然后異步線程每200ms(且臟數據達到16K,commitCommitLogLeastPages = 4)將緩沖區的數據commit寫入FileChannel。NHe28資訊網——每日最新資訊28at.com

再喚醒定時服務(FlushRealTimeService類)將FileChannel里的數據持久化到磁盤。flush函數和commit一樣也可以傳入一個刷盤頁數,當臟頁數量達到16K時(flushLeastPages = 4),會進行刷盤操作,調用FileChannel的force將內存中的數據持久化到磁盤。NHe28資訊網——每日最新資訊28at.com

開啟transientStorePoolEnable參數后,性能最好,但是相對來說持久化最不可靠NHe28資訊網——每日最新資訊28at.com

如何處理消息的過期和刪除?

RocketMQ 使用存儲時長作為消息存儲的依據,即每個節點對外承諾消息的存儲時長。在存儲時長范圍內的消息都會被保留,無論消息是否被消費;超過時長限制的消息則會被清理掉。NHe28資訊網——每日最新資訊28at.com

需要注意的是,在RocketMQ中,消息存儲時長并不能完整控制消息的實際保存時間。NHe28資訊網——每日最新資訊28at.com

因為消息存儲仍然使用本地磁盤,本地磁盤空間不足時,為保證服務穩定性消息仍然會被強制清理,導致消息的實際保存時長小于設置的保存時長。NHe28資訊網——每日最新資訊28at.com

建議在存儲成本可控的前提下,盡可能延長消息存儲時長。延長消息存儲時長,可以為緊急故障恢復、應急問題排查和消息回溯帶來更多的可操作空間。NHe28資訊網——每日最新資訊28at.com

總結

  • 存儲模型與存儲類型:commitLog文件存儲消息物理文件,consumeQueue文件夾存儲邏輯隊列索引
  • 如何保證存儲消息不丟失:同步&異步刷盤、主從消息同步
  • 如何提高寫入性能:零拷貝技術MMAP和FileChannel、緩沖區增強 + 異步刷盤 策略
  • 如何清理過期消息:按存儲時長清理消息

本文鏈接:http://www.tebozhan.com/showinfo-26-5709-0.html三分鐘白話RocketMQ系列—— 如何存儲消息

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 編程的思辨力:程序員們解析技術背后的思想

下一篇: gRPC?vs?REST:創建API的方法比較

標簽:
  • 熱門焦點
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • 谷歌KDD'23工作:如何提升推薦系統Ranking模型訓練穩定性

    谷歌在KDD 2023發表了一篇工作,探索了推薦系統ranking模型的訓練穩定性問題,分析了造成訓練穩定性存在問題的潛在原因,以及現有的一些提升模型穩定性方法的不足,并提出了一種新
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 小紅書1周漲粉49W+,我總結了小白可以用的N條漲粉筆記

    作者:黃河懂運營一條性教育視頻,被54萬人“珍藏”是什么體驗?最近,情感博主@公主是用鮮花做的,火了!僅僅憑借一條視頻,光小紅書就有超過128萬人,為她瘋狂點贊!更瘋狂的是,這
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網聯合創
  • 共享單車的故事講到哪了?

    來源丨海克財經與共享充電寶相差不多,共享單車已很久沒有被國內熱點新聞關照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發報道稱,成都、天津、鄭州等地多個共享單
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁“充值中心”入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 三星折疊屏手機去年銷售近1000萬臺 今年目標定為1500萬

    7月29日消息,三星率先發力可折疊手機市場,在全球市場已經取得了非常亮眼的成績,接下來會進一步鞏固和擴大這一優勢。三星在推出Galaxy Z Flip5和Galax
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
Top