主流消息隊列技術總結和對比

消息隊列(Message Queue,簡稱 MQ)作為構建分布式互聯網應用的關鍵組件,松耦合的架構設計能顯著提升系統的可用性與可擴展性。在分布式系統中扮演著至關重要的角色,主要承擔著實現異步消息傳遞、應用解耦、流量削峰以及消息通訊等關鍵功能。

一、消息隊列的應用場景

1、異步處理

以用戶注冊并需發送注冊郵件和短信為例。用戶完成注冊后,系統需要執行發送注冊郵件和注冊短信這兩項操作。傳統的處理方式有串行和并行兩種,具體如下:

1)串行方式:先將注冊信息成功寫入數據庫,接著發送注冊郵件,最后發送注冊短信。只有當這三個任務全部完成后,才會向客戶端返回結果。

2)并行方式:在將注冊信息成功寫入數據庫后,同時發送注冊郵件和注冊短信。同樣,要等這三個任務都完成,再向客戶端返回結果。與串行方式相比,并行方式能縮短處理時間。假設每個業務節點的處理時間均為 50 毫秒,不考慮網絡等其他開銷,那么串行方式的總耗時為 150 毫秒,并行方式的總耗時則可能為 100 毫秒。由于 CPU 在單位時間內處理的請求數是固定的,假設 CPU1 秒內的吞吐量是 100 次,那么串行方式 1 秒內 CPU 可處理的請求量約為 7 次(1000ms/150ms),并行方式則約為 10 次(1000ms/100ms)。

而引入消息隊列后,對于非必須的業務邏輯,可采用異步處理方式。改造后的架構下,用戶的響應時間相當于注冊信息寫入數據庫的時間,即 50 毫秒。因為注冊郵件和發送短信的請求寫入消息隊列后便直接返回,且寫入消息隊列的速度極快,耗時基本可忽略不計。如此一來,系統的吞吐量可提升至每秒 20 QPS,相比串行方式提高了 3 倍,相比并行方式提高了 2 倍。

2、應用解耦

以用戶下單購買業務為例。在傳統模式中,用戶下單后,訂單系統需要調用庫存系統的接口來通知庫存系統。這種模式存在明顯缺點:一是若庫存系統無法訪問,訂單減庫存操作就會失敗,進而導致訂單失敗;二是訂單系統與庫存系統存在緊密耦合。

引入應用消息隊列后的方案則有效解決了這些問題:

1)訂單系統:用戶下單后,訂單系統完成持久化處理,將消息寫入消息隊列,隨后向用戶返回訂單下單成功的信息。

2)庫存系統:通過訂閱下單的消息,采用拉取或推送的方式獲取下單信息,然后根據這些信息進行庫存操作。

即便在下單時庫存系統無法正常使用,也不會影響用戶正常下單,因為訂單系統在將信息寫入消息隊列后,就不再關注后續操作了。這就實現了訂單系統與庫存系統的應用解耦。

3、流量削峰

流量削峰是消息隊列的又一常用場景,在秒殺或團搶活動中應用廣泛。秒殺活動往往會因參與人數過多導致流量暴增,極易使應用崩潰。為解決這一問題,可在應用前端加入消息隊列,其作用主要有兩點:一是能夠控制參與活動的人數;二是可以緩解短時間內的高流量對應用造成的壓力。

具體實現方式如下:

1)服務器接收用戶的請求后,首先將其寫入消息隊列。若消息隊列的長度超過最大限制,就直接拋棄該用戶請求或引導用戶跳轉到錯誤頁面。

2)秒殺業務根據消息隊列中的請求信息,進行后續的處理。

4、消息通訊

消息通訊是指消息隊列通常內置了高效的通信機制,因此也可用于消息通訊。例如,可實現點對點消息隊列或聊天室等功能。這實際上對應了消息隊列的兩種消息模式,即點對點模式和發布訂閱模式。

二、常用消息隊列各項對比

特性

ActiveMQ

RabbitMQ

RocketMQ

Kafka

生產者消費者模式(Producer-Consumer)

支持

支持

支持

支持

發布訂閱模式(Publish-Subscribe)

支持

支持

支持

支持

請求回應模型(Request-Reply)

支持

支持

不支持

不支持

API 完備性

多語言支持

支持

支持

只支持 JAVA

支持

單機吞吐量

萬級

萬級

萬級

十萬級

消息延遲

微秒級

毫秒級

毫秒級

可用性

高(主從)

高(主從)

非常高(分布式)

非常高(分布式)

消息丟失

理論上不會丟失

理論上不會丟失

文檔的完備性

提供快速入門

社區活躍度

商業支持

阿里云

主流云服務廠商?

三、ActiveMQ、RabbitMQ、RocketMQ、Kafka 特點

ActiveMQ

ActiveMQ 是一個歷史悠久的開源項目,在眾多產品中都有應用。它實現了 JMS1.1 規范,能與 spring-jms 輕松融合,還支持多種協議。不過,它不夠輕巧(源代碼比 RocketMQ 多),支持持久化到數據庫,但在隊列數量較多的情況下,表現欠佳。

RabbitMQ

相比 Kafka,RabbitMQ 更為成熟,支持 AMQP 事務處理。在可靠性方面,它超過 Kafka;在性能方面,又優于 ActiveMQ。

RocketMQ

RocketMQ 是阿里開源的消息中間件,目前正在 Apache 進行孵化。它采用純 Java 開發,具有高吞吐量、高可用性的特點,適合大規模分布式系統應用。其設計思路源于 Kafka,但并非簡單復制,而是對消息的可靠傳輸及事務性進行了優化。目前,RocketMQ 在阿里集團被廣泛應用于交易、充值、流計算、消息推送、日志流式處理、binglog 分發等場景,支撐了阿里多次雙十一活動。由于它是阿里從實踐中發展而來的產品,部分接口和 API 的通用性不是很強。但它的可靠性毋庸置疑,且在性能上與 Kafka 一脈相承甚至更優,還支持海量消息堆積。

Kafka

Kafka 的設計初衷是處理日志,不支持 AMQP 事務處理,可將其視為一個日志系統,針對性很強,因此并不具備成熟 MQ 應有的全部特性。不過,Kafka 的性能(吞吐量、tps)強于 RabbitMQ,在處理大數據量的快速處理場景中,比 RabbitMQ 更具優勢。

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

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

相關文章

數據結構 順序表(3)---順序表的應用

在之間的兩篇文章中,我們著重講了順序表及順序表的實現。今天這篇文章我們將簡單講解關于順序表的三個算法題。這三個題也都屬于力扣上的經典例題。1.例題1:移除元素例題來源(力扣) : https://leetcode.cn/problems/remove-element/description/這是一道數組操作算法…

逆向入門(9)匯編篇-bound指令的學習

看程序的時候碰到這么一行沒見過的代碼,簡單記錄一下 00427AC8 |. 6215 3C7B4200 |bound edx,qword ptr ds:[0x427B3C]這里是用到了bound指令,這是 x86 匯編中的指令,用于檢查數組索引是否在有效范圍內。 指令解析 bound edx, qword ptr ds…

【web應用】若依框架中,使用Echarts導出報表為PDF文件

文章目錄前言一、Echarts準備工作1、查看是否安裝了Echarts2、Echarts導入script 中3、使用Echarts創建圖表二、報表制作打印html2canvas和jsPDF準備工作1、安裝html2canvas和jsPDF依賴包2、html2canvas和jsPDF引用到script中3、制作并打印報表三、導出結果前言 若依框架前端中…

優選算法 --(雙指針算法 1~8)

引言:此專欄為記錄算法學習,本專題作為算法學習的第一部分,優選算法專題共計100題,分為不同小模塊進行,算法學習需堅持積累,時代不會辜負長期主義者,僅以此句,與君共勉。 講解算法分…

XRDMatch代碼復現與分析報告

XRDMatch代碼復現與分析報告 1. 項目概述 XRDMatch是一個用于X射線衍射(XRD)數據匹配和分析的開源工具,由zhengwan-chem開發并托管在GitHub上。本項目旨在復現XRDMatch的核心功能,并對其實現進行詳細分析。 X射線衍射是材料科學中用于確定晶體結構的重要技術,通過分析衍射…

SpringAI×Ollama:Java生態無縫集成本地大模型實踐指南

摘要 隨著大語言模型(LLM)的普及,數據隱私和技術棧統一性成為企業級AI應用的核心挑戰。本文系統闡述如何通過SpringAI框架與Ollama本地化模型引擎的結合,構建安全高效的生成式AI應用。通過實戰案例解析配置優化、流式響應、工具調用等關鍵技術,為Java開發者提供零Python依…

從采購申請到報廢核銷:如何用數字化縫合企業物資管理的“斷點”?

在企業的日常運營中,物資管理是一項至關重要的工作。從采購申請到物資的入庫、使用,再到最終的報廢核銷,這一系列流程就像一條長長的鏈條,環環相扣。然而,在傳統管理模式下,這條鏈條上卻存在著諸多“斷點”…

AVL平衡二叉樹

01. 初始AVL樹 AVL樹是最早發明的自平衡二叉搜索樹。在AVL樹中,任何節點的兩個子樹的高度差(平衡因子)最多為1,這使得AVL樹能夠保持較好的平衡性,從而保證查找、插入和刪除操作的時間復雜度都是O(log n)。包含n個節點…

教育行業可以采用Html5全鏈路對視頻進行加密?有什么優勢?

文章目錄前言一、什么是Html5加密?二、使用Html5對視頻加密的好處三、如何采用Html5全鏈路對視頻進行加密?四、教育行業采用Html5全鏈路視頻加密有什么優勢?總結前言 面對優質課程盜錄傳播的行業痛點,教育機構如何守護核心知識產…

Vue3 tailwindcss

1、安裝tailwindcsspnpm i -D tailwindcss postcss autoprefixer # yarn add -D tailwindcss postcss autoprefixer # npm i -D tailwindcss postcss autoprefixer2、 創建TailwindCSS配置文件npx tailwindcss init -ptailwind.config.js/** type {import(tailwindcss).Config}…

提示工程:解鎖大模型潛力的核心密碼

以下是對Lilian Weng的提示工程權威指南(原文鏈接)的深度解析與博客化重構,融入最新行業實踐: 提示工程:解鎖大模型潛力的核心密碼 ——從基礎技巧到工業級解決方案全解析 一、重新定義人機交互范式 傳統編程 vs 提示…

Python3郵件發送全指南:文本、HTML與附件

在 Python3 中,使用內置的 smtplib 庫和 email 模塊發送郵件是一個常見的需求。以下是更詳細的實現指南,包含各種場景的解決方案和技術細節:一、發送純文本郵件的完整實現準備工作:確保已開通 SMTP 服務(各郵箱開啟方式…

CSS和CSS3區別對比

CSS(層疊樣式表)與CSS3(CSS的第三個版本)的區別主要體現在功能擴展、語法特性以及應用場景等方面。以下是兩者的核心對比: 一、核心概念與版本關系CSS:是基礎樣式表語言,用于分離網頁內容與樣式…

JVM--監控和故障處理工具

一、命令行工具 1. jps (Java Process Status) 作用:列出當前系統中所有的 Java 進程 常用命令: jps -l # 顯示進程ID和主類全名 jps -v # 顯示JVM啟動參數 輸出示例: 1234 com.example.MainApp 5678 org.apache.catalina.startup.Bootstra…

推薦 7 個本周 yyds 的 GitHub 項目。

01.開源的 CRM 軟件這是一個開源的客戶關系管理(CRM)系統,現在又 32.5K 的 Star。為企業和團隊提供比肩 Salesforce 等商業產品的功能,同時強調用戶自主權、數據自由與高度可定制性。開源地址:https://github.com/twen…

linux網絡編程之單reactor模型(一)

Reactor 是一種事件驅動的設計模式(Event-Driven Pattern),主要用于處理高并發 I/O,特別適合網絡服務器場景。它通過一個多路復用機制監聽多個事件源(如 socket 文件描述符),并在事件就緒時將事…

瀏覽器重繪與重排

深入解析瀏覽器渲染:重排(Reflow)與重繪(Repaint)的性能陷阱與優化策略作為一名前端開發者,你是否遇到過界面突然卡頓、滾動時頁面抖動或輸入框響應遲鈍?這些常見性能問題背后,往往是重排與重繪在作祟。本文將深入剖析瀏覽器渲染機…

day049-初識Ansible與常用模塊

文章目錄0. 老男孩思想-人脈的本質1. Ansible1.1 密鑰認證1.2 安裝ansible1.3 添加ansible配置文件1.4 配置主機清單文件(Inventory)1.5 測試1.6 ansible的模塊思想1.7 command模塊1.8 需求:每臺服務器的密碼都不同,怎么批量執行業…

力扣網編程134題:加油站(雙指針)

一. 簡介 前面兩篇文章使用暴力解法,或者貪心算法解決了力扣網的加油站問題,文章如下: 力扣網編程150題:加油站(暴力解法)-CSDN博客 力扣網編程150題:加油站(貪心解法&#xff09…

XPath 語法【Web 自動化-定位方法】

🧭 XPath 語法簡介(Web 自動化核心定位手段)一、XPath 是什么?XPath(XML Path Language)是用于在 XML/HTML 文檔中定位節點的語言,由 W3C 標準定義。瀏覽器支持的是 XPath 1.0。應用場景廣泛&am…