MQ選型及RocketMQ架構總覽

一、什么是MQ

MQ(MessageQueue)
Message(消息):消息是在不同進程之間傳遞的數據,這些進程可以在同一臺機器上,也可以在不同的機器上。
Queue(隊列):隊列原意是指一種具有FIFO(先進先出)特性的數據結構,是用來緩存數據的。
我們要學習的MQ產品對接的使用對象是應用程序。
它是一種在應用程序之間傳遞消息的通信方式,通過將消息發送到中間件(消息隊列)來實現解耦和異步處理。消息隊列允許發送者將消息放入隊列中,而接收者可以從隊列中獲取消息進行處理。這種方式可以提高系統的可靠性、擴展性和靈活性,同時降低系統之間的依賴性和耦合度。常見的消息隊列系統有RabbitMQ、Apache Kafka、RocketMQ。

二、MQ有什么作用

MQ的主要作用包括:

  1. 異步通信:通過消息隊列,發送者和接收者之間的通信可以變為異步方式,發送者將消息放入隊列后即可繼續處理其他任務,而不需要等待接收者的響應。這能提高系統響應時間
    在這里插入圖片描述

  2. 解耦合:使用消息隊列可以將不同模塊或服務之間的耦合度降低。發送者只需要將消息發送到隊列中,而不需要關心具體的接收者是誰,接收者也可以從隊列中獲取消息進行處理,而不需要知道消息的來源。當下游服務出現問題無法提供服務時,不會影響到上游服務繼續提供服務,這一點在分布式系統中尤為重要。
    在這里插入圖片描述

  3. 緩沖和削峰:當發送者產生大量請求時,消息隊列可以作為緩沖區,暫時存儲這些請求,然后由接收者按照自己的處理能力逐個處理。同時,當請求過多導致系統壓力過大時,消息隊列可以平滑地削峰,避免系統崩潰或性能下降。
    在這里插入圖片描述

三、MQ介紹及選型

在這里插入圖片描述

RabbitMQ

  • 遵從AMQP協議
    AMQP簡單來說就是規定好了MQ的各個抽象組件,使得很好被開源框架所集成,比如Spring AMQP專門就是用來操作AMQP架構的中間件的,因此RabbitMQ可以被Spring Boot很方便的集成。
  • 豐富的消費模型:Fanout(廣播)、direct(精確路由)、topic(模糊路由)
  • 消息延遲低(微秒級)
  • 吞吐量不高
  • 使用erlang語言,使得其根據業務進行二次開發的成本比較高

RocketMQ

RocketMQ出自阿里公司的開源產品,用 Java 語言實現,在設計時參考了 Kafka,并做出了自己的一些改進,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被廣泛應用在訂單,交易,充值,流計算,消息推送,日志流式處理,binglog分發等場景。

  • 天生的分布式架構
  • 消息可靠性和吞吐量都很高,以及豐富的消息消費模式使他適用于大多數業務場景

Kafka

Apache Kafka是一個分布式消息發布訂閱系統。它最初由LinkedIn公司基于獨特的設計實現為一個分布式的提交日志系統( a distributed commit log),之后成為Apache項目的一部分。Kafka系統快速、可擴展并且可持久化。它的分區特性,可復制和可容錯都是其不錯的特性。

  • Kafka的設計目標是實現高吞吐量的消息傳遞,適用于處理大量的實時數據流。
  • 支持的消費模式比較單一

具體企業開發中使用如何呢?

Kafka 一開始的目的就是用于日志收集和傳輸,適合有大量數據產生的互聯網業務,特別是大數據領域的實時計算、日志采集等場景,用 Kafka 絕對沒錯,社區活躍度高,業內標準。

RocketMQ 特別適用于金融互聯網領域這類對于可靠性要求很高的場景,比如訂單交易等,而且 RocketMQ 是阿里出品的,經歷過那么多次淘寶雙十一的考驗,大品牌,在穩定性值得信賴。但如果阿里不再維護這個技術了,社區有可能突然黃掉的風險。因此如果公司對自己的技術實力有自信,基礎架構研發實力較強,推薦用 RocketMQ。

RabbitMQ 適用于公司對外提供能力,可能會有很多主題接入的中臺業務場景,畢竟它是百萬級主題數的。它的時效性是毫秒級的,但實際毫秒級和微秒級在感知上沒有什么太大的區別,所以它的這一大優點并不太會作為考量標準。同時,它的功能是比較完善的,開源社區活躍度高,能解決開發中遇到的bug,所以萬級別數據量業務場景的小公司可以優先選擇功能完善的RabbitMQ。它的缺點就是用 Erlang 語言編寫,所以很多開發人員很難去看懂源碼并進行二次開發和維護,也就是說對于公司來說可能處于不可控的狀態。

RocketMQ的核心部分概述

生產者(Producer)

RocketMQ生產者是消息的發送方,用于向RocketMQ中的主題發布消息。生產者負責將消息發送到指定的主題,并將消息傳遞給訂閱該主題的消費者進行消費。

消費者(Consumer)

RocketMQ消費者是消息的接收方,用于從RocketMQ中的主題訂閱消息并進行消費。消費者負責從指定的主題中拉取消息或者監聽隊列,然后對消息進行處理。

消費者組(ConsumerGroup)

  • 為了消費能力的水平擴展,ConsumerGroup的概念應運而生。

RocketMQ消費者組是一組具有相同消費邏輯的消費者實例的集合。在RocketMQ中,一個主題可以由多個消費者組進行訂閱和消費。
消費者組的主要作用是實現消息的負載均衡和容錯能力。當一個主題有多個消費者組時,RocketMQ會將該主題的消息分配給各個消費者組進行處理。每個消費者組內的消費者實例則共同承擔該組內消息的消費任務。這樣做的好處是能夠提高消息的消費速度和并發處理能力。

主題(Topic)

  1. 標識消息分類:RocketMQ的主題用于對消息進行分類和組織。通過為不同類型的消息分配不同的主題,可以使消息更具可讀性和可管理性。
  2. 獨立的消息隊列:每個主題都有自己的消息隊列,用于存儲該主題下的消息。每個隊列都可以并行地接收和處理消息,從而實現高吞吐量和負載均衡。
  3. 消息路由:生產者在發送消息時指定目標主題,消費者則通過訂閱感興趣的主題來接收對應的消息。RocketMQ根據主題將消息路由到相應的隊列上,然后再由消費者消費。

在這里插入圖片描述

NameServer

RocketMQ的NameServer是一個用于管理和維護消息隊列的元數據信息的組件。它是RocketMQ的核心組件之一,負責記錄每個Topic的路由信息和Broker的狀態信息。

Broker

在RocketMQ中,Broker是消息隊列的核心組件之一。它負責存儲和轉發消息,并提供消息的發布和訂閱功能。他是一個物理概念,你可以認為他是一個服務節點。

MessageQueue

定義: 隊列是 Apache RocketMQ 中消息存儲和傳輸的實際容器,也是 Apache RocketMQ 消息的最小存儲單元。 Apache RocketMQ 的所有主題都是由多個隊列組成,以此實現隊列數量的水平拆分和隊列內部的流式存儲。

為了消息寫入能力的水平擴展,RocketMQ 對 Topic進行了分區,這種操作被稱為隊列(MessageQueue)。

對于RocketMQ同一個消費者組下的多個consumer需要與topic下的messagequeue建立對應關系,而一個messagequeue只能被一個consumer進行消費。因此增加的Conusmer實例最多也只能和Topic下的MessageQueue數量相等,如果繼續增加就會有消費者空閑。
[圖片]

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

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

相關文章

python與java的區別

java老程序員來學習python了,記錄一下兩種類型語言的區別: Python與Java變量類型對比 python里面定義變量不需要指定變量的數據類型,并且是可以修改成其他類型java里面定義變量要指定變量的數據類型,指定以后不可以修改成其他數據…

固件簽名技術深度解析:HSM模塊如何守護設備安全,CAS系統如何賦能產業升級

引言:數字時代的固件安全危機 在萬物互聯的今天,全球設備固件安全事件頻發:某汽車品牌因固件漏洞導致百萬車輛被遠程控制,某醫療設備廠商因固件篡改引發數據泄露,某工業控制系統因非法固件升級造成生產線癱瘓……這些…

修改Typora快捷鍵

代碼 的默認快捷鍵為: 這對我來說不太友好,太難按了,而且我電腦右邊的Ctrl鍵壞了,這意味著我只能一個左手去按這3個鍵的組合,這更是難上加難了,于是想到改一下快捷鍵,代碼塊 是Ctrl Shift K&…

Bellman-Ford算法(詳解版)

Bellman-Ford算法 Bellman-Ford算法是用來解決,對于有負權的圖的**單源最短路徑**.因為DJ算法不可以解決對于負權的圖,所以使用這個算法來求解.但是依舊不可以有負回路.因為負回路就沒有存在單源最短路徑這一說. BF的另一個重要的用途就是用來檢測**是不是存在負回路** 思路…

《HarmonyOSNext的ForEach數組渲染の核心玩法與避坑指南》

《HarmonyOSNext教學寶典:ForEach數組渲染全攻略與性能優化》 #HarmonyOS開發 #ArkTS實戰 #組件解析 🎯 ForEach組件完全指南:數組循環渲染核心機制 舉個栗子🌰: ForEach相當于智能印刷機,將數組元素自動轉…

單片機 - STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式

STM32F407 ADC 模式詳解:單次轉換、連續轉換、掃描模式、非掃描模式 前言 在 STM32F407 中,ADC(模數轉換器)模塊常用于采集模擬信號,比如讀取光敏電阻、電壓、電流、溫度傳感器等。STM32 的 ADC 模式較多&#xff0c…

開源模型應用落地-工具使用篇-從零開始搭建Qdrant Web UI-可視化管理工具-Windows(十)

一、前言 Qdrant 是一個高性能的向量搜索引擎,廣泛應用于相似性搜索、推薦系統和大規模數據檢索等場景。雖然其原生 API 提供了強大的功能,但對于開發者和運維人員來說,缺乏直觀的可視化界面常常增加了使用門檻。為了解決這一問題&#xff0c…

高頻交易技術:訂單簿分析與低延遲架構——從Level 2數據挖掘到FPGA硬件加速的全鏈路解決方案

高頻交易技術:訂單簿分析與低延遲架構——從Level 2數據挖掘到FPGA硬件加速的全鏈路解決方案 一、引言:高頻交易的技術本質 1.1 速度即利潤的微觀戰場 數據揭示:據NYSE實測,每降低1微秒延遲可獲得年化$700-1500萬套利窗口&#…

基于生成對抗網絡(GAN)的圖像生成與編輯:原理、應用與實踐

前言 生成對抗網絡(GAN)是近年來深度學習領域中最具影響力的技術之一。自2014年由Ian Goodfellow等人首次提出以來,GAN已經在圖像生成、圖像編輯、風格轉換等多個領域取得了令人矚目的成果。GAN的核心思想是通過生成器(Generator&…

pytorch基本運算-梯度運算:requires_grad_(True)和backward()

引言 前序學習進程中,已經對pytorch基本運算中的求導進行了基礎討論,相關文章鏈接為: 導數運算pytorch基本運算-導數和f-string-CSDN博客 實際上,求導是微分的進一步計算,要想求導的前一步其實是計算微分&#xff1…

idea64.exe.vmoptions配置

這個idea64.exe.vmoptions文件是用于配置 IntelliJ IDEA(64位版本)運行時的 Java 虛擬機(JVM)參數。這些參數直接影響到 IDEA 的性能、內存使用、調試能力和行為。 下面是對文件中每一行配置的詳細解讀: -Xms2048m 作…

齊次變換矩陣相乘的復合變換:左乘與右乘的深度解析

在三維幾何變換中,齊次變換矩陣相乘是實現復雜變換的核心方法。本文將通過一個包含四個變換步驟的完整示例,深入探討齊次變換矩陣左乘和右乘的區別,并結合 Python sympy 庫的代碼實現,詳細闡述變換過程和結果差異。 二維齊次坐標的旋轉變換 在二維齊次坐標系中,一個點可以…

5g LDPC編譯碼-LDPC編碼

目錄 1、LDPC編碼基礎知識 2、5g的LDPC編碼 2.1 LDPC分塊: 2.2 LDCP編碼 2.3 校驗位的產生 1、LDPC編碼基礎知識 LDPC屬于線性分組碼,線性分組碼的基本知識如下: 編碼后的碼字是由初始二進制序列與生成矩陣在二進制域相乘后得到,生成矩陣與校驗矩陣,校驗矩陣與編碼后…

OpenVINO使用教程--resnet分類模型部署

OpenVINO使用教程--resnet分類模型部署 本節內容模型準備推理測試分析&總結本節內容 OpenVINO 根據AI技術類型將部署任務分成傳統模型模型部署和生成式AI模型部署,傳統模型指的是各種CNN小模型,這部分部署只需要OpenVINO包,具體安裝教程可以參考之前的章節:OpenVINO環境…

無字母數字webshell的命令執行

在Web安全領域,WebShell是一種常見的攻擊手段,通過它攻擊者可以遠程執行服務器上的命令,獲取敏感信息或控制系統。而無字母數字WebShell則是其中一種特殊形式,通過避免使用字母和數字字符,來繞過某些安全機制的檢測。 …

C++斯特林數在C++中的數學理論與計算實現1

一、 斯特林數概述 1.1 組合數學中的核心地位 斯特林數(Stirling Numbers)是組合數學中連接排列、組合與分劃問題的核心工具,分為兩類: 第一類斯特林數(Stirling Numbers of the First Kind)&#xff1a…

[C++] STL大家族之<map>(字典)容器(附洛谷)

map-目錄 使用方法頭文件與聲明定義基本操作 使用方法 頭文件與聲明定義 頭文件是: #include <map>我們這樣聲明一個字典: map</*key_type*/, /*value_type*/> /*map_name*/; // 例子: map<int, char> mp;這里稍作解釋: key_type是你每個鍵值對中的鍵的…

使用 Flutter 在 Windows 平臺開發 Android 應用

以下是完整的開發流程&#xff0c;包括環境搭建、代碼實現和應用發布&#xff0c;幫助你開發一個具有地圖顯示、TCP 通信功能的 Android 應用。 一、環境搭建 1. 安裝 Flutter SDK 從 Flutter 官網 下載最新穩定版 SDK解壓到本地目錄&#xff08;如 D:\flutter&#xff09;添…

【模板】埃拉托色尼篩法(埃氏篩)

一、算法簡介 在數論與編程競賽中&#xff0c;求解 [ 1 , n ] [1,n] [1,n] 范圍內的所有質數是常見的基礎問題。埃拉托色尼篩法&#xff08;Sieve of Eratosthenes&#xff09; 是一種古老而高效的算法&#xff0c;可以在 O ( n log ? log ? n ) O(n \log \log n) O(nlogl…

AI Agent實戰 - LangChain+Playwright構建火車票查詢Agent

本篇文章將帶你一步步構建一個智能火車票查詢 Agent&#xff1a;你只需要輸入自然語言指令&#xff0c;例如&#xff1a; “幫我查一下6月15號從上海到南京的火車票” Agent就能自動理解你的需求并使用 Playwright 打開 12306 官網查詢前 10 條車次信息&#xff0c;然后匯總結果…