【每日八股】學習 RocketMQ Day2:進階(一)

文章目錄

  • 復習昨日內容
    • 為什么要使用消息隊列
    • 為什么選擇 RocketMQ
    • RocketMQ 的優缺點?
    • 談談你對 RocketMQ 的理解?
    • 消息隊列有哪些類型?
    • RocketMQ 采用哪種消息隊列模型?
    • 消息的消費模式了解嗎?
    • 了解 RocketMQ 的基本架構嗎?
    • 詳細解釋一下 RocketMQ 基本架構中四個構成部分的作用?
  • 學習 RocketMQ Day2:進階(一)
    • 如何保證消息的可用性/可靠性/不丟失呢?
    • 如何處理消息重復的問題呢?

復習昨日內容

為什么要使用消息隊列

消息隊列是大規模分布式系統中非常常用的一項中間件技術,它的具體應用場景有:確保可靠性、服務解耦、消息異步、削峰填谷。

解耦
在分布式系統中,服務提供方可以作為生產者將服務響應打包為消息事件,發送到消息隊列當中,服務需求方從消息隊列中消費事件,這樣可以完成服務上下游的解耦,避免服務調用鏈上的某一環出錯而導致服務雪崩。

消息異步
系統中耗時的工作可以打包為消息事件并放到 MQ 當中,由消費者異步消費事件,發送到 MQ 之后可以快速響應用戶請求。比較典型的消息異步例子是:用戶新建訂單后,將商品服務和庫存服務的調用交由 MQ 異步處理。

削峰
削峰是 MQ 尤其是 RocketMQ 最典型的應用場景。通過 MQ,可以將瞬時的高流量轉化為持續的中低等流量,從而保護系統不被瞬時高流量沖垮。具體來說,大量用戶請求到達系統后,將用戶請求打包為消息事件交由 MQ,并快速響應用戶請求。MQ 中的消息按順序排隊,從而達到削峰的效果。

為什么選擇 RocketMQ

RocketMQ 具有低延遲、高吞吐量、高可用性等特點,非常適用于并發量大、實時性要求高的場景。

RocketMQ 的優缺點?

優點

  • 單機吞吐量:十萬級;
  • 可用性:非常高,基于分布式架構,方便拓展;
  • 消息可靠性:經過參數優化配置,可以做到 0 丟失;
  • RocketMQ 支持 10 億級別的消息堆積,不會因為消息堆積導致性能下降;
  • 阿里出品,經過雙十一等多輪電商場景的考驗,穩定性值得信賴。

缺點

  • 基于 Java 開發,對其他客戶端的支持性較差;
  • 系統遷移需要大量代碼。

談談你對 RocketMQ 的理解?

RocketMQ 是一款可靠性強,可用性高,適用于并發量高,吞吐量大場景的消息隊列中間件,主要由 NameServer、Broker、Producer 和 Consumer 四部分組成。

RocketMQ 的優勢在于低毫秒延遲億級消息堆積能力事務消息順序消息支持,通過主從結構、數據分片和零拷貝技術保障高吞吐和可靠性,尤其適合電商和金融交易這類高吞吐以及強一致的場景。

對比 Kafka,RocketMQ 支持事務且實時性更好;對比 RabbitMQ,RocketMQ 勝在分布式拓展能力以及海量消息的處理能力。

消息隊列有哪些類型?

消息隊列可以分為隊列模型發布-訂閱模型

隊列模型指的就是 Producer 將消息放在隊列當中,由 Consumer 進行消費。一旦 Consumer Group 中有一個 Consumer 將消息消費了,那么這個消息就不存在了,消費者之間是競爭關系。隊列模型較為簡單,是最基本的 MQ 模型。

發布-訂閱模型中進一步引入了發布者(Publiser)、訂閱者(Subscriber)以及主題(Topic)這三個概念。發布者負責生產和發送消息,它不直接將消息發送給訂閱者,而是發送給消息隊列組件;訂閱者會接收所訂閱主題的所有消息;主題是消息的分類或通道,發布者將消息發送到特定主題,訂閱者從特定的主題接收消息。

發布-訂閱模型的工作原理可以概括為:訂閱者向消息系統注冊一個或多個感興趣的主題,發布者將消息發送到特定主題,消息系統負責將消息傳遞給所有訂閱了該主題的訂閱者,每個訂閱者獨立接收消息,彼此之間互不影響,也就是說一份消息可以被多次消費

RocketMQ 采用哪種消息隊列模型?

RocketMQ 采用發布-訂閱模型。

RocketMQ 的消息模型在邏輯上包含多個核心組件,它們的協同工作構成了完整的消息系統。具體來說:
1. 基礎消息單元:由 Message 以及 Message 的 Tag 構成。

  • Message:消息傳輸的最小單位;
  • Tag:Message 的二級分類(可以不指定 Tag),比如可以將一條發送給 Trade Topic 的 Message 進一步細分為 Payment / Refund …

2. 消息組織單元

  • Topic(主題):消息的一級分類,是消息的邏輯通道。生產者在發送消息時,必須指定消息的 Topic。同時,Topic 也是消費者訂閱的基本單位。
  • Queue(隊列):Queue 是消息實際存放的物理存儲分片,每個 Topic 默認包含 4 個 Queue。生產者向 Topic 寫入消息時,消息會均勻分布到某個 Queue,即** Message 會通過某種調度策略落到單個 Queue 當中**。Queue 是實現并行消費和水平拓展的基礎。

3. 消費相關組件

  • Consumer Group(消費者組):消費者組是一組行為相同的消費者的邏輯集合。消費者組的消費模式有兩種,分別是集群模式和廣播模式。不同消費者組獨立消費進度。
  • Producer Group(生產者組):生產者組是一組行為相同的生產者。

4. 消費位置管理

  • Offset(偏移量):標識消費者在 Queue 當中的消費進度。

消息的消費模式了解嗎?

消息消費模式有兩種:集群模式廣播模式

默認情況下,消費者組采用集群消費,也就是一個消費者組當中的消費者競爭的消費 Topic 下的一條消息,一旦一條消息被消費過了,就不能重復消費了。

廣播消費模式指的是 Topic 下的每一份消息都會發送給消費者組當中的每一個消費者消費一次。

了解 RocketMQ 的基本架構嗎?

RocketMQ 的基本架構分為四部分,分別是 NameServer、Broker、Consumer 和 Producer。四者都采用集群模式部署,方便在分布式系統中快速地拓展。

詳細解釋一下 RocketMQ 基本架構中四個構成部分的作用?

NameServer
NameServer 是無狀態(這里的「無狀態」指的是 NameServer 僅存儲最基本的路由元信息,所有數據的狀態都是臨時的,不會被持久化,而是僅存儲在內存當中)服務器,角色類似于 Kafka 中的 Zookeeper。它的特點如下:

  • 每個 NameServer 節點相互獨立,無信息交互;
  • NameServer 幾乎是無狀態的,通過部署多個節點來標識自己是一個偽集群。Producer 在發送消息時,會預先從 NameServer 得知自己要發送給的 Topic 的 Queue 位于哪個 Broker 上。Consumer 也會定時從 NameServer 獲取 Topic 的 Queue 所在的 Broker 信息。Broker 在啟動時,會將自己注冊到 NameServer 當中,并通過心跳機制確保存活,定時維護 Topic 信息到 NameServer。
  • 「需要注意的是」:由于 NameServer 節點之間相互獨立,因此 Broker 啟動時以及心跳保活時,都需要將自己的狀態發送給所有 NameServer 并行地進行注冊。邏輯上來說,NameServer 集群當中的所有節點最終的狀態是一致的。

Broker
Broker 扮演消息存儲與中轉的角色。具體來說,Broker 的職責如下:

  • 消息存儲:持久化消息數據;
  • 消息路由:保存 Topic 與 Queue 的映射關系;
  • 服務提供:響應 Producer 的寫入請求與 Consumer 的拉取請求;
  • 高可用保障:通過主從架構實現數據冗余。

在 Broker 當中,真正存儲消息的是 CommitLog,而 ConsumeGroup 存儲消息的邏輯隊列索引,它標記的是消息在 CommitLog 中的位置,按 Topic 和 Queue 進行分組。

單個 Broker 與所有 NameServer 保持長連接,定時將 Topic 信息同步到 NameServer。

Producer
Producer 是 RocketMQ 中負責發送消息的客戶端組件,它是消息的源頭,將業務系統產生的消息發送到 Broker 服務器。具體來說,Producer 有三種消息發送的模式,分別是:

  • 同步發送:等待 Broker 返回確認消息;
  • 異步發送:通過回調函數處理發送消息的結果;
  • 單項發送:不關心發送的結果。

Producer 會自動從 NameServer 獲取 Topic 的路由信息,從而將 Message 發送到 Topic 所在的 Broker 服務器,因此 Producer 只需要知道 NameServer 的服務地址即可。

Consumer
Consumer 是 RocketMQ 中負責接收消息的客戶端組件,它從 Broker 中根據 Topic 拉取消息交由業務線程處理,是消息隊列的最終目的地。

Consumer 有兩種主要的消費模式,分別是:

  • 拉取(Pull)模式:主動從 Broker 拉取感興趣 Topic 的消息;
  • 推送(Push)模式:Broker 推送消息給消費者(底層仍然是消費者主動拉取);

學習 RocketMQ Day2:進階(一)

在這里插入圖片描述

如何保證消息的可用性/可靠性/不丟失呢?

消息的可靠性保障可以從:生產者、中間存儲、消費者三方面入手。

生產者
在生產階段,通過請求確認機制,來確保消息成功被存儲

  • 同步發送時:注意處理響應結果與異常。消息成功發送才算成功,如果響應失敗,則需要重試機制確保消息重新發送;
  • 異步發送時:需要在回調函數中處理發送失敗的情況,同樣通過重試機制來確保消息重新發送;
  • 如果發生響應超時,可以通過查詢日志的 API 來查看消息是否成功存儲到 Broker,如果失敗仍然需要重試。

中間存儲
存儲階段,可以通過配置可靠性優先的 Broker 來避免因故障宕機而造成的消息丟失:

  • 消息只要持久化到了 CommitLog,即使 Broker 宕機,未經消費的消息也不會丟失;
  • Broker 的刷盤機制:同步刷盤與異步刷盤。顯然同步刷盤更可靠。
  • Broker 通過主從模式確保高可用;

消費者
在消費者保障消息可靠意味著需要消費者成功將消息消費。關鍵在于消費者在客戶端確認消息成功消費的時機,不應該在消息剛剛收到就確認消費,而應該在業務執行完畢時才確認消費。這樣可以確保業務執行失敗時可以重新消費消息。

如何處理消息重復的問題呢?

RocketMQ 可以確保消息一定投遞且不丟失,即有消息可靠性保障,但是 RocketMQ 不能確保消息不被重復消費。

避免重復消費的兩個手段是確保在業務端做好冪等性處理,或是進行消息去重。

冪等性指的就是多次相同的操作不會對系統產生副作用,顯然讀操作一定具備冪等性,難點在于如何確保寫操作具有冪等性,比如庫存系統如果收到重復的扣減庫存消息,如何避免庫存被重復扣減?

一個可選的確保冪等性的方式是,通過 MySQL 記錄一張表,比如對于電商系統,新建一個訂單表并使用唯一的 ID 對訂單進行標識,這個表應該具有一個訂單狀態,如果訂單的狀態是已支付,那么重復到來的消息就不應該再一次扣減庫存了。當然也可以在 Redis 緩存中設置標志位來達到類似的效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79779.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79779.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

探索智能體開發新邊界:Cangjie Magic開源平臺體驗與解析

文章目錄 每日一句正能量前言一、Cangjie Magic的核心技術(一)Agent DSL架構(二)原生支持MCP通信協議(三)智能規劃功能 二、實際應用場景(一)智能客服系統(二&#xff09…

深入解析進程間通信與Socket原理:從理論到TypeScript實戰

文章目錄 一、進程中如何通信1.1 管道1.1.1 核心特性1.1.2 缺點1.1.3 匿名管道與命名管道的對比 1.2 信號1.2.1 核心特性1.2.2 缺點1.2.3 信號分類對比 1.3 消息隊列1.3.1 核心特性1.3.2 缺點 1.4 共享內存1.4.1 核心特性1.4.2 缺點 1.5 信號量1.5.1 核心特性1.5.2 缺點 二、So…

力扣-hot100(旋轉圖像)

48. 旋轉圖像 中等 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 示例 1: 輸入:matrix [[1,2,3],[4…

Docker編排工具---Compose的概述及使用

目錄 一、Compose工具的概述 二、Compose的常用命令 1、列出容器 2、查看訪問日志 3、輸出綁定的公共端口 4、重新構建服務 5、啟動服務 6、停止服務 7、刪除已停止服務的容器 8、創建和啟動容器 9、在運行的容器中執行命令 10、指定一個服務啟動容器的個數 11、其…

C25-數組應用及練習

第一題 題目: 代碼 #include <stdio.h> int main() {//數組及相關數據定義int arr[10];int i;//基于循環的數組數據輸入for(i0;i<10;i){arr[i]i;}//基于循環的數組數據輸出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }結果 第二題 題目 代碼 …

網絡安全怎么入門?快速了解

網絡安全是一個快速發展的領域&#xff0c;入門需要系統化的學習和實踐。以下是適合零基礎或轉行者的分階段學習路徑&#xff0c;涵蓋必備知識、學習資源、實戰方法和職業方向&#xff1a; 一、基礎階段&#xff08;1-3個月&#xff09; 1. 掌握核心基礎知識 計算機網絡&#…

express 怎么搭建 WebSocket 服務器

一&#xff1a;使用 express-ws var express require(express); var app express(); var expressWs require(express-ws)(app);app.use(function (req, res, next) {console.log(middleware);req.testing testing;return next(); });app.get(/, function(req, res, next){…

【AI論文】SuperEdit:修正并促進基于指令的圖像編輯的監督信號

摘要&#xff1a;由于手動收集準確的編輯數據存在挑戰&#xff0c;現有的數據集通常使用各種自動化方法構建&#xff0c;導致編輯指令和原始編輯圖像對之間不匹配導致監督信號出現噪聲。 最近的研究試圖通過生成更高質量的編輯圖像、在識別任務上進行預訓練或引入視覺語言模型&…

關于大疆紅外圖片提取溫度方法 python 方法

思路 紅外圖片需要是黑白圖片 提取紅外圖片最高和最低溫度 溫度圖例 根據最高溫度31.2攝氏度 最低溫度19.9攝氏度 那中間的值在 0到255 之間 那有這個值之后。就可以獲取到圖片里面 每個點或者面的值 實現方式 def find_Gray(self, t_max, t_min, c_temp):"""…

金融小知識

&#x1f4c9; 一、“做空”是啥&#xff1f; 通俗說法&#xff1a;押“它會跌”&#xff0c;賺錢&#xff01; ? 舉個例子&#xff1a; 有一天老王的包子漲價到 10 塊一個&#xff0c;張三覺得這價格肯定撐不住&#xff0c;未來會跌到 5 塊。于是他&#xff1a; 向朋友借了…

JavaScript 數據存儲全攻略:從 Cookie 到 IndexedDB

1. Cookie&#xff1a;傳統的輕量級存儲 Cookie 是最早的客戶端存儲解決方案之一&#xff0c;最初設計用于服務器和客戶端之間的狀態保持。 基本用法 javascript 復制 下載 // 設置cookie document.cookie "usernameJohnDoe; expiresThu, 18 Dec 2025 12:00:00 UTC…

Leetcode 刷題記錄 09 —— 鏈表第三彈

本系列為筆者的 Leetcode 刷題記錄&#xff0c;順序為 Hot 100 題官方順序&#xff0c;根據標簽命名&#xff0c;記錄筆者總結的做題思路&#xff0c;附部分代碼解釋和疑問解答&#xff0c;01~07為C語言&#xff0c;08及以后為Java語言。 01 合并 K 個升序鏈表 /*** Definitio…

如何利用 Elastic Load Balancing 提升應用性能與可用性?

當今云計算的快速發展中&#xff0c;隨著應用需求的增加&#xff0c;如何確保系統能夠高效、穩定地處理不斷增長的流量成為了每個技術團隊關注的焦點。Elastic Load Balancing&#xff08;ELB&#xff09;作為一種強大的工具&#xff0c;能夠幫助開發者和運維人員輕松應對流量波…

Word如何制作三線表格

1.需求 將像這樣的表格整理成論文中需要的三線表格。 2.直觀流程 選中表格 --> 表格屬性中的邊框與底紋B --> 在設置中選擇無&#xff08;重置表格&#xff09;–> 確定 --> 選擇第一行&#xff08;其實是將第一行看成獨立表格了&#xff0c;為了設置中線&…

JVM的雙親委派模型

引言 Java類加載機制中的雙親委派模型通過層層委托保證了核心類加載器與應用類加載器之間的職責分離和加載安全性&#xff0c;但其單向的委托關系也帶來了一些局限性。尤其是在核心類庫需要訪問或實例化由應用類加載器加載的類時&#xff0c;雙親委派模型無法滿足需求&#xf…

6.4.高并發設計

目錄 一、高并發系統設計基礎理論 CAP定理與高可用性權衡 ? 一致性&#xff08;C&#xff09; vs 可用性&#xff08;A&#xff09;在電商、社交場景的取舍 ? 分區容錯性&#xff08;P&#xff09;的實踐意義&#xff1a;異地多活與腦裂處理 性能指標與評估模型 ? QPS、TP…

工程師轉型算法工程師 深入淺出理解transformer-手搓板

編碼器 以下部分引用臺灣大學李宏毅教授的ppt 自己理解解釋一遍(在youtobe 上可以搜索李宏毅即可) 首先先來看transformer的架構圖 Embedding 我們先從Imput Embedding 跟 OutPutEmbedding 開始&#xff0c;讓我們用 bert 模型來做一個解釋 從huggingface上下載的bert-base…

軟件工程學概述

一、軟件危機 &#xff08;一&#xff09;軟件危機的介紹 1. 基本思想與定義 軟件危機&#xff08;Software Crisis&#xff09;是指在計算機軟件的開發和維護過程中所遇到的一系列嚴重問題&#xff0c;這些問題既包括技術層面的挑戰&#xff0c;也涉及管理層面的困境。其核心…

【ArcGIS Pro微課1000例】0068:Pro原來可以制作演示文稿(PPT)

文章目錄 一、新建演示文稿二、插入頁面1. 插入地圖2. 插入空白文檔3. 插入圖像4. 插入視頻三、播放與保存一、新建演示文稿 打開軟件,新建一個地圖文檔,再點擊【新建演示文稿】: 創建的演示文檔會默認保存在目錄中的演示文稿文件夾下。 然后可以對文檔進行簡單的設計,例如…

[吾愛出品][Windows] 產品銷售管理系統2.0

[Windows] 產品銷售管理系統 鏈接&#xff1a;https://pan.xunlei.com/s/VOPej1bHMRCHy2np9w3TBOyKA1?pwdgjy7# 使用方法&#xff1a;1、先設置一下圖片保存路徑 2、維護產品。客戶等基礎信息。例如&#xff1a;銷售類型&#xff1a;一次性 銷售編碼&#xff1a;RCX。 3、銷…