【八股消消樂】消息隊列優化—系統架構設計

在這里插入圖片描述

😊你好,我是小航,一個正在變禿、變強的文藝傾年。
🔔本專欄《八股消消樂》旨在記錄個人所背的八股文,包括Java/Go開發、Vue開發、系統架構、大模型開發、具身智能、機器學習、深度學習、力扣算法等相關知識點,期待與你一同探索、學習、進步,一起卷起來叭!

目錄

  • 題目
  • 答案
    • Why use 消息隊列?
    • 秒殺場景
    • 訂單超時取消
    • 事件驅動(Event-Driven)

題目

💬技術棧:RocketMQ、Kafka、RabbitMQ

🔍簡歷內容:熟悉消息隊列常見應用場景,基于事件驅動實現了 SAGA 的分布式事務,保證了事務的低耦合、高擴展、高可用。

🚩面試問:你為什么用 Kafka、RabbitMQ 或 RocketMQ,又或者說你為什么使用某一個中間件?


在這里插入圖片描述

💡建議暫停思考10s,你有答案了嘛?如果你有不同題解,歡迎評論區留言、打卡。


答案

前置準備:

  • 你們公司有沒有使用消息隊列?主要用于解決什么場景的問題?
  • 如果使用了消息隊列,那么在具體的場景下不使用消息隊列是否可行?和使用消息隊列的方案比起來,有什么優缺點?
  • 你們公司用的是什么消息隊列,它有什么優缺點?

Why use 消息隊列?

為什么要用消息隊列?【其實就是再問在這個業務場景下,不異步、不解耦或者不削峰會有什么問題?】

答案:如果不用消息隊列,性能差、擴展性差、可用性差。【同步調用的缺點】

性能差:業務方必須停下來等待結果,如果我這里需要通知三個下游,那么就需要發起三次調用,并且等它們各自的結果返回之后才能繼續往下執行,或者返回響應,這樣性能太差了。

在這里插入圖片描述

擴展性差:在使用消息隊列的時候,新的下游要接入,只需要自己去訂閱消息就可以,完全不需要通知任何人。在公司里,可能就是你丟給下游一個文檔,下游自己看看文檔,知道訂閱哪個 topic,消息生產速率有多高,差不多就能自己獨立完成接入了

而同步調用的時候,上游必須知道下游的接口,然后要知道如何構造請求、如何解析響應,還要聯調、測試、上線,整個過程都得和下游密切合作,因此效率特別低,可擴展性很差。

在這里插入圖片描述

如果在某些場景下確實不能用消息隊列,那么這個擴展性問題可以通過一些技術手段來緩解。比如說上游提供一整套的對接規范,包括 API 定義、請求和響應中每個字段的含義。這樣下游就對著這個 API 定義來提供實現,上游就不需要適配每一個下游了。

在這里插入圖片描述

可用性:在同步調用方案中,你必須要確保調用所有的下游都成功了才算是成功了。所以你還需要額外考慮部分成功部分失敗的問題。

秒殺場景

架構設計:

在這里插入圖片描述
利用消息隊列把整個秒殺過程分成輕重兩個部分

  • 進入消息隊列之前:秒殺請求進來之后,會有一個輕量級的服務。這個服務就是做一些限流、請求校驗和庫存扣減的事情。這些事情差不多都是內存操作,最多操作 Redis。當庫存扣減成功之后,就會把秒殺請求丟到一個消息隊列
  • 進入消息隊列之后:訂單服務會從消息隊列里面將請求拿出來真正創建訂單,并且提示用戶支付。這一部分就是重量級的操作,無法支撐大規模并發。

在這里插入圖片描述

訂單超時取消

場景:扣減了庫存之后,用戶沒有支付怎么辦。

解決方案:如果用戶下單之后一直沒有支付,那么這個訂單就會被取消,從而釋放庫存。想利用消息隊列實現訂單超時取消功能,需要使用 延時消息。(超時時間是 30 分鐘)

延時消息:發送者在發送之后,要過一段時間,消費者才能消費的消息

在這里插入圖片描述

可能引發的并發問題:在 30 分鐘這一個時刻,一邊用戶支付,一邊消費者也消費超時消息,就會有并發問題

在這里插入圖片描述

解決思路:使用分布式鎖、樂觀鎖(在你把訂單更新為超時狀態的時候,需要 確保原始狀態還是未支付。支付那邊也需要確保只有在 status 是未支付的時候才能發起支付。),也可以使用 SELECT FOR UPDATE 鎖住訂單,防止并發操作。

目前主流的消息隊列中 RocketMQ 是支持延時消息的,它有插件支持。但是 Kafka 不支持。

事件驅動(Event-Driven)

事件驅動適合用來解決一些 復雜、步驟繁多、流程冗長 的業務問題。

在這里插入圖片描述
場景:事件驅動結合 SAGA 分布式事務。

在這里插入圖片描述

當某一個步驟完成之后,就會發出一個或者多個事件,驅動事務中的后續步驟。包括回滾也是這樣,比如說發出一個代表某一個步驟執行失敗的事件,對應的消費者就會去執行反向補償步驟

不過在實時性上要比同步調用差一點。比如說你有一個分布式事務,就是要求先更新 DB,再更新緩存。那么在緩存更新失敗的場景下,過程看起來就像圖里展示的這樣。

在這里插入圖片描述


往期精彩專欄內容,歡迎訂閱:

🔗【八股消消樂】20250622:Elasticsearch查詢優化
🔗【八股消消樂】20250620:Elasticsearch優化—檢索Labubu
🔗【八股消消樂】20250619:構建微服務架構體系—保證服務高可用
🔗【八股消消樂】20250615:構建微服務架構體系—鏈路超時控制
🔗【八股消消樂】20250614:構建微服務架構體系—實現制作庫與線上庫分離
🔗【八股消消樂】20250612:構建微服務架構體系—限流算法優化
🔗【八股消消樂】20250611:構建微服務架構體系—降級策略全總結
🔗【八股消消樂】20250610:構建微服務架構體系—熔斷恢復抖動優化
🔗【八股消消樂】20250609:構建微服務架構體系—負載均衡算法如何優化
🔗【八股消消樂】20250608:構建微服務架構體系—服務注冊與發現
🔗【八股消消樂】20250607:MySQL存儲引擎InnoDB知識點匯總
🔗【八股消消樂】20250606:MySQL參數優化大匯總
🔗【八股消消樂】20250605:端午節產生的消費數據,如何分表分庫?
🔗【八股消消樂】20250604:如何解決SQL線上死鎖事故
🔗【八股消消樂】20250603:索引失效與優化方法總結
🔗【八股消消樂】20250512:慢SQL優化手段總結
🔗【八股消消樂】20250511:項目中如何排查內存持續上升問題
🔗【八股消消樂】20250510:項目中如何優化JVM內存分配?
🔗【八股消消樂】20250509:你在項目中如何優化垃圾回收機制?
🔗【八股消消樂】20250508:Java編譯優化技術在項目中的應用
🔗【八股消消樂】20250507:你了解JVM內存模型嗎?
🔗【八股消消樂】20250506:你是如何設置線程池大小?
🔗【八股消消樂】20250430:十分鐘帶背Duubo中大廠經典面試題
🔗【八股消消樂】20250429:你是如何在項目場景中選取最優并發容器?
🔗【八股消消樂】20250428:你是項目中如何優化多線程上下文切換?
🔗【八股消消樂】20250427:發送請求有遇到服務不可用嗎?如何解決?

📌 [ 筆者 ]   文藝傾年
📃 [ 更新 ]   2025.6.23
? [ 勘誤 ]   /* 暫無 */
📜 [ 聲明 ]   由于作者水平有限,本文有錯誤和不準確之處在所難免,本人也很想知道這些錯誤,懇望讀者批評指正!

在這里插入圖片描述

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

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

相關文章

WebSocket長連接在小程序中的實踐:消息推送與斷線重連機制設計

一、引言:為什么需要WebSocket長連接? 傳統方案的痛點:HTTP輪詢的低效性(高延遲、高資源消耗)小程序場景需求:實時消息推送(如IM、直播彈幕、IoT設備狀態同步)技術選型對比&#xf…

MySQL索引使用指南:何時該為字段添加索引?

在MySQL的性能優化中,索引是最常用且有效的手段之一。但“索引不是萬能藥”——盲目添加索引可能導致寫操作變慢、存儲空間浪費,甚至引發索引失效問題。本文將結合原理與實戰場景,幫你理清??“何時該用索引”??的核心判斷邏輯。 一、先理…

AI時代關鍵詞SEO優化

內容概要 在人工智能(AI)驅動的時代浪潮下,搜索引擎優化(SEO)正迎來深刻變革,關鍵詞策略已成為流量獲取的核心戰場。本文將系統剖析AI時代關鍵詞優化的前沿方法,涵蓋語義分析的精準研究、用戶意…

GO 語言學習 之 代碼風格

1. 命名規范 字母數字和下劃線組成 以小寫字母、大寫字母或下劃線開頭 不允許包含標點符號、運算符、空白字符(空格、TAB、換行)等 采用駝峰命名法 (大駝峰、小駝峰) 見名知義:命名要有實際意義,易讀性&am…

【軟考高級系統架構論文】論云上自動化運維及其應用

論文真題 云上自動化運維是傳統IT運維和 DevOps的延伸,通過云原生架構實現運維的再進化。云上自動化運維可以有效幫助企業降低IT運維成本,提升系統的靈活度,以及系統的交付速度,增強系統的可靠性,構建更加安全、可信、開放的業務平臺。 請圍繞“云上自動化運維及其應用”…

錯誤: 程序包androidx.fragment.app不存在 import android

錯誤: 程序包androidx.fragment.app不存在 import androidx.fragment.app.FragmentActivity; 這個是什么錯?dependencies { //implementation fileTree(dir: libs, include: [*.jar]) implementation project(path: :libscan) //noinspection GradleCompatible implementation…

Java UDP Socket 實時在線刷卡掃碼POS消費機門禁控制板服務端示例源碼

本示例使用的設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bYG0BuO&ftt&id17021194999 一、獲取本電腦所有網卡IP public static String getIP() {Enumeration<NetworkInterface> netInterfaces;ArrayList<String>…

MATLAB基礎應用精講-【數模應用】層次分析法(AHP)(附MATLAB和python代碼實現)

目錄 前言 算法原理 什么是層次分析法(AHP) 注意事項 基本原理 算法步驟 1建立層次結構 2構建判斷矩陣 3計算權重向量 4一致性檢驗 SPSSAU AHP層次分析案例 1、背景 2、理論 3、操作 4、SPSSAU輸出結果 5、文字分析 6、剖析 疑難解惑 數據如何錄入? 如何…

Macintosh小電腦、小手機 | openKylin最新硬件創意形態首次亮相!

近期&#xff0c;OpenAtom openKylin&#xff08;簡稱 “openKylin”&#xff09;社區與嘉立創旗下的立創開發板團隊展開深度技術合作&#xff0c;成功完成立創?泰山派1開發板與openKylin 2.0操作系統的兼容適配。5月24日&#xff0c;嘉立創“第三屆開源硬件星火會”在深圳盛大…

基于Spring Boot的計算機考研交流系統的設計與實現

基于Spring Boot的計算機考研交流系統的設計與實現 隨著計算機科學的發展&#xff0c;越來越多的學生選擇考研來提高自己的專業水平。然而&#xff0c;考研的過程中&#xff0c;學生們面臨著各種問題&#xff0c;如學習資料的獲取、交流平臺的缺乏等。為了更好地滿足這些需求&…

技術逐夢之旅:從C語言到Vue的成長之路

董翔&#xff0c;一個對軟件技術充滿熱忱的00后。從初次在屏幕上敲出"Hello World"的激動&#xff0c;到如今能夠獨立開發完整Web應用的從容&#xff0c;我的編程之路見證了技術的迭代與自我的蛻變。 作為軟件專業的學生&#xff0c;我始終堅信"技術是解決問題…

Qt QMap數據清除測試(驗證QMap內存正確釋放方法)

環境 Qt C (msvc編譯環境) 測試代碼 //定義 動子信息 &#xff08;可放在.cpp文件 中&#xff09; struct MoverInfo{uint32_t ID;double PartPosition;uint16_t ModuleID;uint32_t PartID;uint32_t TrackID;uint32_t TrackID2; };//使用Windows任務管理器查看內存使用情況//…

【安全咨詢】

安全咨詢服務是一個專業領域&#xff0c;旨在幫助個人和組織識別、評估和管理各種安全風險&#xff0c;保護其人員、資產、信息和運營安全。 一、安全咨詢 1.1 服務的核心目標 ?識別風險&#xff1a;?? 發現潛在的、可能對組織或個人造成損害的威脅和漏洞。?評估威脅&am…

vue+elementUI實現固定table超過設定高度顯示下拉條

解決方案&#xff1a; 在表格上添加了style"height: px;"和:max-height""&#xff0c;這兩個設置共同作用使表格在內容超過 設定高度時顯示滾動條配合css使用 高度值可根據實際需求調整 <el-table:data"biddData"style"width: 100%;…

UNet改進(5):線性注意力機制(Linear Attention)-原理詳解與代碼實現

引言 在計算機視覺領域&#xff0c;UNet架構因其在圖像分割任務中的卓越表現而廣受歡迎。近年來&#xff0c;注意力機制的引入進一步提升了UNet的性能。本文將深入分析一個結合了線性注意力機制的UNet實現&#xff0c;探討其設計原理、代碼實現以及在醫學圖像分割等任務中的應…

Unity技能編輯器深度構建指南:打造專業級戰斗系統

本文為技術團隊提供完整的技能編輯器開發指南&#xff0c;涵蓋核心架構設計、資源管線搭建和協作工作流實現&#xff0c;幫助您構建專業級的戰斗技能系統。 一、核心架構設計 1. 基礎框架搭建 專用場景模板&#xff1a; 創建SkillEditorTemplate.unity場景 核心節點&#xff…

《游戲工業級CI/CD實戰:Jenkins+Node.js自動化構建與本地網盤部署方案》

核心架構圖 一、游戲開發CI/CD全流程設計 工作流時序圖 二、Jenkins分布式構建配置 1. 節點管理&#xff08;支持Win/Linux/macOS&#xff09; // Jenkinsfile 分布式配置示例 pipeline {agent {label game-builder // 匹配帶標簽的構建節點}triggers {pollSCM(H/5 * * * *)…

Python內存使用分析工具深度解析與實踐指南(上篇)

文章目錄 引言1. sys.getsizeof()功能程序示例適用場景 2. pandas.Series.memory_usage()功能程序示例適用場景 3. pandas.Series.memory_usage(deepTrue)功能程序示例適用場景注意事項 4. pympler.asizeof()功能安裝程序示例適用場景 5. tracemalloc&#xff08;標準庫&#x…

Python 使用 Requests 模塊進行爬蟲

目錄 一、請求數據二、獲取并解析數據四、保存數據1. 保存為 CSV 文件2. 保存為 Excel 文件打開網頁圖片并將其插入到 Excel 文件中 五、加密參數逆向分析1. 定位加密位置2. 斷點調試分析3. 復制相關 js 加密代碼&#xff0c;在本地進行調試&#xff08;難&#xff09;4. 獲取 …

MySQL行轉列、列轉行

要達到的效果&#xff1a; MySQL不支持動態行轉列 原始數據&#xff1a; 以行的方式存儲 CREATE TABLE product_sales (id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(50) NOT NULL,category VARCHAR(50) NOT NULL,sales_volume INT NOT NULL,sales_date DATE N…