RocketMQ高階特性

趙廣陸發表於2020-12-20

1 訊息的儲存

  1. 訊息生成者傳送訊息到MQ
  2. MQ返回ACK給生產者
  3. MQ push 訊息給對應的消費者
  4. 訊息消費者返回ACK給MQ

說明:ACK(Acknowledge character)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-5s4sb0sb-1608424674212)(img/image-20201211162105593.png)]

2 訊息的儲存

  1. 訊息生成者傳送訊息到MQ
  2. MQ收到訊息,將訊息進行持久化,儲存該訊息
  3. MQ返回ACK給生產者
  4. MQ push 訊息給對應的消費者
  5. 訊息消費者返回ACK給MQ
  6. MQ刪除訊息

注意:

  1. 第⑤步MQ在指定時間內接到訊息消費者返回ACK,MQ認定訊息消費成功,執行⑥
  2. 第⑤步MQ在指定時間內未接到訊息消費者返回ACK,MQ認定訊息消費失敗,重新執行④⑤⑥

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-k19teOuu-1608424674214)(img/image-20201211162231313.png)]

3 訊息的儲存介質

  1. 資料庫
    1. ActiveMQ
    2. 缺點:資料庫瓶頸將成為MQ瓶頸
  2. 檔案系統
    1. RocketMQ/Kafka/RabbitMQ
    2. 解決方案:採用訊息刷盤機制進行資料儲存
    3. 缺點:硬碟損壞的問題無法避免

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-BLxJWHgf-1608424674215)(img/image-20201211162334322.png)]

4 高效的訊息儲存與讀寫方式

  1. SSD(Solid State Disk)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-iKSuQdxq-1608424674217)(img/image-20201211162416020.png)]

    1. 隨機寫(100KB/s)

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-rWxIzKpU-1608424674219)(img/image-20201211162448564.png)]

    2. 順序寫 (600MB/s)1秒1部電影

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-IM0tP5fA-1608424674221)(img/image-20201211162541076.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-2tztxUsC-1608424674222)(img/image-20201211162638525.png)]

  1. Linux系統傳送資料的方式

  2. “零拷貝”技術

    1. 資料傳輸由傳統的4次複製簡化成3次複製,減少1次複製過程
    2. Java語言中使用MappedByteBuffer類實現了該技術
    3. 要求:預留儲存空間,用於儲存資料(1G儲存空間起步)

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-egdxv7LF-1608424674222)(img/image-20201211162729614.png)]

5 訊息儲存結構

  1. MQ資料儲存區域包含如下內容
    1. 訊息資料儲存區域
      1. topic
      2. queueId
      3. message
    2. 消費邏輯佇列
      1. minOffset
      2. maxOffset
      3. consumerOffset
    3. 索引
      1. key索引
      2. 建立時間索引

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-vpYRcmTh-1608424674223)(img/image-20201211162857722.png)]

6 刷盤機制

  1. 同步刷盤

    1. 生產者傳送訊息到MQ,MQ接到訊息資料

    2. MQ掛起生產者傳送訊息的執行緒

    3. MQ將訊息資料寫入記憶體

    4. 記憶體資料寫入硬碟

    5. 磁碟儲存後返回SUCCESS

    6. MQ恢復掛起的生產者執行緒

    7. 傳送ACK到生產者

      [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-UTkSYfLk-1608424674224)(img/image-20201211163159680.png)]

  2. 非同步刷盤

    1. 生產者傳送訊息到MQ,MQ接到訊息資料
    2. MQ將訊息資料寫入記憶體
    3. 傳送ACK到生產者

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-30rRfaOz-1608424674225)(img/image-20201211163238738.png)]

  1. 同步刷盤:安全性高,效率低,速度慢(適用於對資料安全要求較高的業務)
  2. 非同步刷盤:安全性低,效率高,速度快(適用於對資料處理速度要求較高的業務)

配置方式

#刷盤方式
#- ASYNC_FLUSH 非同步刷盤
#- SYNC_FLUSH 同步刷盤
flushDiskType=SYNC_FLUSH

7 高可用性

  1. nameserver
    1. 無狀態+全伺服器註冊
  2. 訊息伺服器
    1. 主從架構(2M-2S)
  3. 訊息生產
    1. 生產者將相同的topic繫結到多個group組,保障master掛掉後,其他master仍可正常進行消 息接收
  4. 訊息消費
    1. RocketMQ自身會根據master的壓力確認是否由master承擔訊息讀取的功能,當master繁忙 時候,自動切換由slave承擔資料讀取的工作

8 主從資料複製

  1. 同步複製

    1. master接到訊息後,先複製到slave,然後反饋給生產者寫操作成功
    2. 優點:資料安全,不丟資料,出現故障容易恢復
    3. 缺點:影響資料吞吐量,整體效能低
  2. 非同步複製

    1. master接到訊息後,立即返回給生產者寫操作成功,當訊息達到一定量後再非同步複製到slave
    2. 優點:資料吞吐量大,操作延遲低,效能高
    3. 缺點:資料不安全,會出現資料丟失的現象,一旦master出現故障,從上次資料同步到故障時間的資料將丟失
  3. 配置方式

    #Broker 的角色
    #- ASYNC_MASTER 非同步複製Master
    #- SYNC_MASTER 同步雙寫Master
    #- SLAVE
    brokerRole=SYNC_MASTER
    

9 負載均衡

  1. Producer負載均衡
    1. 內部實現了不同broker叢集中對同一topic對應訊息佇列的負載均衡
  2. Consumer負載均衡
    1. 平均分配
    2. 迴圈平均分配
  3. 廣播模式(不參與負載均衡)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aVmIkza6-1608424674226)(img/image-20201211163654002.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-N13CLhow-1608424674227)(img/image-20201211163706995.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-iHcIFwor-1608424674227)(img/image-20201211163736770.png)]

10 訊息重試

  1. 當訊息消費後未正常返回消費成功的資訊將啟動訊息重試機制
  2. 訊息重試機制
    1. 順序訊息
    2. 無序訊息

10.1 順序訊息重試

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-eZeixBYT-1608424674228)(img/image-20201211163848104.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-H8o9GhDH-1608424674229)(img/image-20201211163854405.png)]

  1. 當消費者消費訊息失敗後,RocketMQ會自動進行訊息重試(每次間隔時間為 1 秒)
  2. 注意:應用會出現訊息消費被阻塞的情況,因此,要對順序訊息的消費情況進行監控,避免阻塞現象的發生

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-D5GRrN10-1608424674229)(img/image-20201211163910587.png)]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-GKef0VyZ-1608424674230)(img/image-20201211163928369.png)]

10.2 無序訊息重試

  1. 無序訊息包括普通訊息、定時訊息、延時訊息、事務訊息
  2. 無序訊息重試僅適用於負載均衡(叢集)模型下的訊息消費,不適用於廣播模式下的訊息消費
  3. 為保障無序訊息的消費,MQ設定了合理的訊息重試間隔時長

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-mhhTpx9n-1608424674231)(img/image-20201211164005887.png)]

11 死信佇列

  1. 當訊息消費重試到達了指定次數(預設16次)後,MQ將無法被正常消費的訊息稱為死信訊息(Dead-Letter Message)
  2. 死信訊息不會被直接拋棄,而是儲存到了一個全新的佇列中,該佇列稱為死信佇列(Dead-Letter Queue)\
  3. 死信佇列特徵
    1. 歸屬某一個組(Gourp Id),而不歸屬Topic,也不歸屬消費者
    2. 一個死信佇列中可以包含同一個組下的多個Topic中的死信訊息
    3. 死信佇列不會進行預設初始化,當第一個死信出現後,此佇列首次初始化
  4. 死信佇列中訊息特徵
    1. 不會被再次重複消費
    2. 死信佇列中的訊息有效期為3天,達到時限後將被清除

12 死信處理

  1. 在監控平臺中,通過查詢死信,獲取死信的messageId,然後通過id對死信進行精準消費

13 訊息重複消費

  1. 訊息重複消費原因
    1. 生產者傳送了重複的訊息
      1. 網路閃斷
      2. 生產者當機
    2. 訊息伺服器投遞了重複的訊息
      1. 網路閃斷
    3. 動態的負載均衡過程
      1. 網路閃斷/抖動
      2. broker重啟
      3. 訂閱方應用重啟(消費者)
      4. 客戶端擴容
      5. 客戶端縮容

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-h5BdDveK-1608424674231)(img/image-20201211164244534.png)]

14 訊息冪等

  1. 對同一條訊息,無論消費多少次,結果保持一致,稱為訊息冪等性
  2. 解決方案
    1. 使用業務id作為訊息的key
    2. 在消費訊息時,客戶端對key做判定,未使用過放行,使用過拋棄
  3. 注意:messageId由RocketMQ產生,messageId並不具有唯一性,不能作用冪等判定條件

相關文章