RocketMQ知識整理與總結

来源:https://www.cnblogs.com/zhyg/archive/2019/02/28/10451518.html
-Advertisement-
Play Games

1、架構 RocketMQ的master broker與master broker沒有任何消息通訊,nameserver之間也同樣沒有消息通信 MQ歷史 由數據結構隊列發展而來 MQ使用場景 非同步處理 解耦 削峰填谷 數據同步 2、隊列 rocketMQ一個主題(topic)包含多個隊列 3、使用 ...


1、架構

 

  RocketMQ的master broker與master broker沒有任何消息通訊,nameserver之間也同樣沒有消息通信

  MQ歷史     

    由數據結構隊列發展而來   

  MQ使用場景

         非同步處理
      解耦
      削峰填谷
      數據同步

2、隊列

  rocketMQ一個主題(topic)包含多個隊列

  

 


3、使用

  生產

    同步(sync)

      預設重試2次總共3次

      預設等待超時時間為3s     

    非同步(async)

      總共重試2次

    單向(oneway)

    Message

      topic:主題名稱

      tag:消息TAG,用於消息過濾對消息的整體分類,比如 topic為物流跟蹤軌跡 ,軌跡包含 攬收 出庫 入庫 派送 簽收,可以分別給這些相同topic不同類型的數據打標簽分類解析處理

      keys:Message索引鍵,多個用空格隔開,RocketMQ可以根據這些key快速檢索到消息對消息關鍵字的提取方便查詢,比如一條消息某個關鍵字是 運單號,之後我們可以使用這個運單號作為關鍵字進行查詢
      waitStoreMsgOK:消息發送時是否等消息存儲完成後再返

      delayTimeLevel:消息延遲級別,用於定時消息或消息重

      User property:自定義消息屬性

    批量發送

      單批次消息不能超過maxMessageSize大小(預設4M)

      客戶端instance:如果instance為預設值DEFAULT的話,RocketMQ會自動將instance設置為IP+進程ID(建議不要設置,預設生成就好),預設最大4M

      鉤子方法:可以執行前後通知

    事物消息

      1分鐘回查一次,預設5次

      事物消息單獨一篇   

  消費

        批量消費總數為32,broker設置

      如果消息消費次數超過maxReconsumeTimes還未成功,則將該消息轉移到一個失敗隊列,等待被刪除

      消息消費超時時間,預設為15分鐘

      消息最大重試次數,預設為16次

      consumeConcurrentlyMaxSpan,併發消息消費時處理隊列最大跨度,預設2000,表示如果消息處理隊列中偏移量最大的消息與偏移量最小的消息的跨度超過2000則延遲50毫秒後再拉取消息

      pullInterval=0,推模式下拉取任務間隔時間,預設一次拉取任務完成繼續拉取

      consumeMessageBatchMaxSize:消息併發消費時一次消費消息條數,通俗點說就是每次傳入MessageListtener#consumeMessage中的消息條數

      RocketMQ消息重試是以消費組為單位,而不是主題,消息重試主題名為%RETRY%+消費組名。消費者在啟動的時候會自動訂閱該主題,參與該主題的消息隊列負載

      同一個消息隊列只會分配給一個消費者,故如果消費者個數大於消息隊列數量,則有些消費者無法消費消息。

      如果延遲級別大於0,則會將消息的主題設置為SCHEDULE_TOPIC_XXXX

      transactionId 事物ID會自己生成

      ConsumeFromWhere

        CONSUME_FROM_FIRST_OFFSET:從頭開始消費

        ONSUME_FROM_TIMESTAMP:從消費者啟動的時間戳對應的消費進度開始消費

        CONSUME_FROM_LAST_OFFSET:從隊列最新偏移量開始消費

        CONSUME_SUCCESS:消費成功

        RECONSUME_LATER:延遲消費,放棄本批次消息消費 類似於continue,如果有重試次數沒有達到最大上限會再次消費

    消息消費模式

      集群模式:預設模式,主題下的同一條消息只允許被其中一個消費者消費

             消費進度存儲在服務端

      廣播模式:主題下的同一條消息將被集群內的所有消費者消費一次

           消費進度存儲在消費者本地

    消息傳輸模式

      拉取消息模式:消費端主動發起拉消息請求

            長輪詢模式使得消息拉取能實現準實時

            從伺服器拉取消息->放入記憶體隊列->提交消息到處理線程池

    併發消費

       推送消息模式:RocketMQ消息推模式的實現基於拉模式

      RocketMQ並沒有真正實現推模式,而是消費者主動向消息伺服器拉取消息,RocketMQ推模式是迴圈向消息服務端發送消息拉取請求

      單獨線程池拉取消息,然後調用監聽api介面

      單獨線程池拉取->記憶體隊列->消息處理線程池處理->移除客戶端記憶體隊列消息並更新進度

    順序消息

      消費過程 消息隊列負載->消息拉取->消息消費->消息消費進度存儲。

      支持局部順序消息消費,也就是保證同一個消息隊列上的消息順序消費

      如果要實現某一主題的全局順序消息消費,可以將該主題的隊列數設置為1,犧牲高性能和可用性

      順序消息在創建消息隊列拉取任務時需要在Broker伺服器鎖定該消息隊列。

      MAX_TIME_CONSUME_CONTINUOUSLY:每次消費任務最大持續時間,預設為60s,切換線程

      順序消息消費的併發度為消息隊列。也就是一個消息消費隊列同一時刻只會被一個消費線程池中一個線程消費。

      達到重試次數上限,轉移到死信隊列,繼續後續消息的消費

    定時消息

      消息發送之後並不立即被消費者消費,而是要等到特定的時間之後才能被消費

      不支持任意時間精度定時發送,只支持配置級別的時間預設為"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h",delayLevel=1表示延遲1s,delayLevel=2表示延遲5s,依次類推。

      SCHEDULE_TOPIC_XXXX定時消息主題

    消息過濾

      tag

        tag服務端只是驗證了TAG的hashcode,客戶端再次對消息進行tag值對比過濾

      sql(SQL92表達式)

        (官方示例有bug)表達式沒有想象的好用,建議大家接收到消息自己判斷篩選

      類過濾:定製過濾消息

        消息過濾伺服器(不講解)

        consumer->filterserver->broker

    單向消息(One-way)

      其實就是UDP協議的實現

      TCP協議是可靠消息傳輸協議,請求消息都會有相應和校驗,在會話層和傳輸層解決應答

4、填坑方案   

  如果有大量消息積壓

    增加消費者數量

  如果有大量消息積壓並且馬上就到了自動清理的時間

    重新消費導流到新的topic,增大新topic的隊列數量

5、bug   

  netty epoll 4.4.0之前版本沒有實現

6、問題   

  為什麼某條消息報異常會阻塞整個隊列消費    

    ProcessQueue中隊列最大偏移量與最小偏離量的間距,不能超過consumeConcurrentlyMaxSpan,否則觸發流控。

    這裡主要的考量是擔心一條消息堵塞,消息進度無法向前推進,可能造成大量消息重覆消費

7、初始化客戶端註解   

  使用@PostConstruct 由JSR-250提供,在構造函數執行完之後執行,等價於xml配置文件中bean的initMethod

  如果同一個jvm中同時註入生產者和消費者使用bean註解會有異常拋出

8、客戶端支持的驅動程式   

  Java

  Go

  .net

  Php

  c++

  Nodejs

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、首先要安裝nodejs和npm。 下載nodejs安裝,下載地址:https://nodejs.org/en/ 安裝很簡單一路next即可。 安裝完成後可以在cmd視窗輸入node -v 和 npm -v 查看是否安裝成功 2、vue-cli腳手架安裝 CMD命令行輸入:npm install ...
  • sudo -s npm install -g yarn react-native-cli ...
  • 今天碰到的一個比較煩人的問題是,在body上添加事件處理函數,發現在iphone上怎麼也沒辦法觸發事件,找了半天,發現iPhone處理冒泡事件的規則: 1.點擊某個元素; 2.如果這個元素上沒有處理該事件,則繼續向上冒泡,直到body下的子節點為止。如果此時還是沒有元素處理這個事件,則丟棄該事件,不 ...
  • 如果你是一個人在自學前端開發,或者是對前端開發有比較濃厚的興趣正想踏入前端領域,只要你在前端自學路上遇到了自己無法解決的技術難題,那麼儘管將你的疑惑交給我的小伙伴兒們吧,我們都是一群在前端自學路上摸爬滾打的有志青年,希望你可以來和我們共同交流。同時也希望你能獻出自己的一份力,幫助我的小伙伴兒們解決他 ...
  • 原型與原型鏈 javascript 創建對象 類與構造函數是大多數編程語言所擁有的,而借鑒了 C 與 JAVA 的 javascript 也是有類和構造函數的,不過 javascript 的實現不太一樣。 上面的例子中, 就是構造函數, 就是它的實例,但是它對共用性不太好,所以有了原型模式。 原型模 ...
  • 這兩天接觸到一個很有意思的 CSS 屬性 -- box-decoration-break。下麵就一起去一探究竟。 因為 MDN 上關於這個屬性,沒有中文文檔,所以一直在想一個合理貼切的中文翻譯。直譯一下: box -- 盒,可以理解為元素盒模型 decoration -- 裝飾,理解為元素樣式 br ...
  • [TOC] 裝飾器進階 通過上一篇已經知道, 如果還有概念還不理解的請返回裝飾器入門 "裝飾器入門" 裝飾器 實際也是一種函數, 他是 python語言的重要組成部分, 在實際開發中應用也相當廣泛. 正如我們所知, 前面所看到的被裝飾的函數都是最簡單函數格式, 這裡所說的簡單, 是指 ,`或者函數沒 ...
  • http://note.youdao.com/noteshare?id=42fc159d62b041e91c9e60822694db9f&sub=6D019045DECF4CAE8ABF5631C2798DCB ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...