RocketMQ高階特性
目錄
1 訊息的儲存
- 訊息生成者傳送訊息到MQ
- MQ返回ACK給生產者
- MQ push 訊息給對應的消費者
- 訊息消費者返回ACK給MQ
說明:ACK(Acknowledge character)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-5s4sb0sb-1608424674212)(img/image-20201211162105593.png)]
2 訊息的儲存
- 訊息生成者傳送訊息到MQ
- MQ收到訊息,將訊息進行持久化,儲存該訊息
- MQ返回ACK給生產者
- MQ push 訊息給對應的消費者
- 訊息消費者返回ACK給MQ
- MQ刪除訊息
注意:
- 第⑤步MQ在指定時間內接到訊息消費者返回ACK,MQ認定訊息消費成功,執行⑥
- 第⑤步MQ在指定時間內未接到訊息消費者返回ACK,MQ認定訊息消費失敗,重新執行④⑤⑥
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-k19teOuu-1608424674214)(img/image-20201211162231313.png)]
3 訊息的儲存介質
- 資料庫
- ActiveMQ
- 缺點:資料庫瓶頸將成為MQ瓶頸
- 檔案系統
- RocketMQ/Kafka/RabbitMQ
- 解決方案:採用訊息刷盤機制進行資料儲存
- 缺點:硬碟損壞的問題無法避免
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BLxJWHgf-1608424674215)(img/image-20201211162334322.png)]
4 高效的訊息儲存與讀寫方式
-
SSD(Solid State Disk)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-iKSuQdxq-1608424674217)(img/image-20201211162416020.png)]
-
隨機寫(100KB/s)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-rWxIzKpU-1608424674219)(img/image-20201211162448564.png)]
-
順序寫 (600MB/s)1秒1部電影
-
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-IM0tP5fA-1608424674221)(img/image-20201211162541076.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2tztxUsC-1608424674222)(img/image-20201211162638525.png)]
-
Linux系統傳送資料的方式
-
“零拷貝”技術
- 資料傳輸由傳統的4次複製簡化成3次複製,減少1次複製過程
- Java語言中使用MappedByteBuffer類實現了該技術
- 要求:預留儲存空間,用於儲存資料(1G儲存空間起步)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-egdxv7LF-1608424674222)(img/image-20201211162729614.png)]
5 訊息儲存結構
- MQ資料儲存區域包含如下內容
- 訊息資料儲存區域
- topic
- queueId
- message
- 消費邏輯佇列
- minOffset
- maxOffset
- consumerOffset
- 索引
- key索引
- 建立時間索引
- 訊息資料儲存區域
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-vpYRcmTh-1608424674223)(img/image-20201211162857722.png)]
6 刷盤機制
-
同步刷盤
-
生產者傳送訊息到MQ,MQ接到訊息資料
-
MQ掛起生產者傳送訊息的執行緒
-
MQ將訊息資料寫入記憶體
-
記憶體資料寫入硬碟
-
磁碟儲存後返回SUCCESS
-
MQ恢復掛起的生產者執行緒
-
傳送ACK到生產者
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UTkSYfLk-1608424674224)(img/image-20201211163159680.png)]
-
-
非同步刷盤
- 生產者傳送訊息到MQ,MQ接到訊息資料
- MQ將訊息資料寫入記憶體
- 傳送ACK到生產者
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-30rRfaOz-1608424674225)(img/image-20201211163238738.png)]
- 同步刷盤:安全性高,效率低,速度慢(適用於對資料安全要求較高的業務)
- 非同步刷盤:安全性低,效率高,速度快(適用於對資料處理速度要求較高的業務)
配置方式
#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH
7 高可用性
- nameserver
- 無狀態+全伺服器註冊
- 訊息伺服器
- 主從架構(2M-2S)
- 訊息生產
- 生產者將相同的topic繫結到多個group組,保障master掛掉後,其他master仍可正常進行消 息接收
- 訊息消費
- RocketMQ自身會根據master的壓力確認是否由master承擔訊息讀取的功能,當master繁忙 時候,自動切換由slave承擔資料讀取的工作
8 主從資料複製
-
同步複製
- master接到訊息後,先複製到slave,然後反饋給生產者寫操作成功
- 優點:資料安全,不丟資料,出現故障容易恢復
- 缺點:影響資料吞吐量,整體效能低
-
非同步複製
- master接到訊息後,立即返回給生產者寫操作成功,當訊息達到一定量後再非同步複製到slave
- 優點:資料吞吐量大,操作延遲低,效能高
- 缺點:資料不安全,會出現資料丟失的現象,一旦master出現故障,從上次資料同步到故障時間的資料將丟失
-
配置方式
#Broker 的角色 #- ASYNC_MASTER 非同步複製Master #- SYNC_MASTER 同步雙寫Master #- SLAVE brokerRole=SYNC_MASTER
9 負載均衡
- Producer負載均衡
- 內部實現了不同broker叢集中對同一topic對應訊息佇列的負載均衡
- Consumer負載均衡
- 平均分配
- 迴圈平均分配
- 廣播模式(不參與負載均衡)
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aVmIkza6-1608424674226)(img/image-20201211163654002.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-N13CLhow-1608424674227)(img/image-20201211163706995.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-iHcIFwor-1608424674227)(img/image-20201211163736770.png)]
10 訊息重試
- 當訊息消費後未正常返回消費成功的資訊將啟動訊息重試機制
- 訊息重試機制
- 順序訊息
- 無序訊息
10.1 順序訊息重試
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eZeixBYT-1608424674228)(img/image-20201211163848104.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-H8o9GhDH-1608424674229)(img/image-20201211163854405.png)]
- 當消費者消費訊息失敗後,RocketMQ會自動進行訊息重試(每次間隔時間為 1 秒)
- 注意:應用會出現訊息消費被阻塞的情況,因此,要對順序訊息的消費情況進行監控,避免阻塞現象的發生
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-D5GRrN10-1608424674229)(img/image-20201211163910587.png)]
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GKef0VyZ-1608424674230)(img/image-20201211163928369.png)]
10.2 無序訊息重試
- 無序訊息包括普通訊息、定時訊息、延時訊息、事務訊息
- 無序訊息重試僅適用於負載均衡(叢集)模型下的訊息消費,不適用於廣播模式下的訊息消費
- 為保障無序訊息的消費,MQ設定了合理的訊息重試間隔時長
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-mhhTpx9n-1608424674231)(img/image-20201211164005887.png)]
11 死信佇列
- 當訊息消費重試到達了指定次數(預設16次)後,MQ將無法被正常消費的訊息稱為死信訊息(Dead-Letter Message)
- 死信訊息不會被直接拋棄,而是儲存到了一個全新的佇列中,該佇列稱為死信佇列(Dead-Letter Queue)\
- 死信佇列特徵
- 歸屬某一個組(Gourp Id),而不歸屬Topic,也不歸屬消費者
- 一個死信佇列中可以包含同一個組下的多個Topic中的死信訊息
- 死信佇列不會進行預設初始化,當第一個死信出現後,此佇列首次初始化
- 死信佇列中訊息特徵
- 不會被再次重複消費
- 死信佇列中的訊息有效期為3天,達到時限後將被清除
12 死信處理
- 在監控平臺中,通過查詢死信,獲取死信的messageId,然後通過id對死信進行精準消費
13 訊息重複消費
- 訊息重複消費原因
- 生產者傳送了重複的訊息
- 網路閃斷
- 生產者當機
- 訊息伺服器投遞了重複的訊息
- 網路閃斷
- 動態的負載均衡過程
- 網路閃斷/抖動
- broker重啟
- 訂閱方應用重啟(消費者)
- 客戶端擴容
- 客戶端縮容
- 生產者傳送了重複的訊息
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-h5BdDveK-1608424674231)(img/image-20201211164244534.png)]
14 訊息冪等
- 對同一條訊息,無論消費多少次,結果保持一致,稱為訊息冪等性
- 解決方案
- 使用業務id作為訊息的key
- 在消費訊息時,客戶端對key做判定,未使用過放行,使用過拋棄
- 注意:messageId由RocketMQ產生,messageId並不具有唯一性,不能作用冪等判定條件
相關文章
- Mongodb高階特性MongoDB
- mysql高階特性MySql
- Redis高階特性Redis
- Python 高階特性Python
- Java高階特性之集合Java
- Java高階特性—泛型Java泛型
- RabbitMQ(二):RabbitMQ高階特性MQ
- MySQL 高階特性篇教程MySql
- JavaScript高階特性 — 作用域JavaScript
- SpringIOC的高階特性Spring
- python高階特性-sorted()Python
- python高階特性-迭代Python
- Java高階特性增強-鎖Java
- PoweJob高階特性-MapReduce完整示例
- Redis 高階特性 Redis Stream使用Redis
- Java 高階特性之 instanceofJava
- 《Java 高階篇》八:新特性Java
- RocketMQ關鍵特性MQ
- MySQL高階特性——繫結變數MySql變數
- MySQL系列-- 5. MySQL高階特性MySql
- RocketMQ進階技巧MQ
- xmake高階特性之自定義選項
- Tomcat高階特性及效能調優Tomcat
- Python 高階特性(4)- 生成器Python
- Java高階特性——註解,簡單易懂Java
- Python類繼承的高階特性Python繼承
- Python高階特性(3): Classes和MetaclassesPython
- BIND 高階特性(二)-- 動態更新(轉)
- Spring 高階特性------資料持久層Spring
- 【RocketMQ】RocketMQ 5.0新特性(二)- Pop消費模式MQ模式
- 【RocketMQ】高階使用:四個問題詳解事務訊息MQ
- 尚矽谷《MySQL高階特性篇》教程釋出MySql
- Redis 基礎、高階特性與效能調優Redis
- 說說 Vue.js 元件的高階特性Vue.js元件
- Redis基礎、高階特性與效能調優Redis
- C++ 引用和函式的高階特性C++函式
- Java高階特性之反射學習總結Java反射
- Java高階特性之列舉學習總結Java