0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是消息隊列?消息隊列中間件重要嗎?

jf_ro2CN3Fa ? 來源:樓仔 ? 作者:樓仔 ? 2022-11-07 14:55 ? 次閱讀

消息隊列中間件重要嗎?面試必問問題之一,你說重不重要。我有時會問同事,為啥你用 RabbitMQ,不用 Kafka,或者 RocketMQ 呢,他給我的回答 “因為公司用的就是這個,大家都這么用”,如果你去面試,直接就被 Pass,今天這篇文章,告訴你如何回答。

這篇文章,我重點突出消息隊列選型,弱化每種隊列內部的實現(xiàn)細節(jié),精華提煉,可讀性更強!

常用的消息隊列主要這 4 種,分別為 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ,主要介紹前三,不BB,上思維導圖!

8887b964-5d7b-11ed-a3b6-dac502259ad0.png

消息隊列基礎

什么是消息隊列?

消息隊列是在消息的傳輸過程中保存消息的容器,用于接收消息并以文件的方式存儲,一個消息隊列可以被一個也可以被多個消費者消費,包含以下 3 元素:

Producer:消息生產者,負責產生和發(fā)送消息到 Broker;

Broker:消息處理中心,負責消息存儲、確認、重試等,一般其中會包含多個 Queue;

Consumer:消息消費者,負責從 Broker 中獲取消息,并進行相應處理。

88b05c84-5d7b-11ed-a3b6-dac502259ad0.png

消息隊列模式

點對點模式:多個生產者可以向同一個消息隊列發(fā)送消息,一個具體的消息只能由一個消費者消費。

88caaf26-5d7b-11ed-a3b6-dac502259ad0.png

發(fā)布/訂閱模式:單個消息可以被多個訂閱者并發(fā)的獲取和處理。

88fb0d92-5d7b-11ed-a3b6-dac502259ad0.png

消息隊列應用場景

應用解耦 :消息隊列減少了服務之間的耦合性,不同的服務可以通過消息隊列進行通信,而不用關心彼此的實現(xiàn)細節(jié)。

異步處理 :消息隊列本身是異步的,它允許接收者在消息發(fā)送很長時間后再取回消息。

流量削鋒 :當上下游系統(tǒng)處理能力存在差距的時候,利用消息隊列做一個通用的”載體”,在下游有能力處理的時候,再進行分發(fā)與處理。

日志處理 :日志處理是指將消息隊列用在日志處理中,比如 Kafka 的應用,解決大量日志傳輸?shù)膯栴}。

消息通訊 :消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊,比如實現(xiàn)點對點消息隊列,或者聊天室等。

消息廣播 :如果沒有消息隊列,每當一個新的業(yè)務方接入,我們都要接入一次新接口。有了消息隊列,我們只需要關心消息是否送達了隊列,至于誰希望訂閱,是下游的事情,無疑極大地減少了開發(fā)和聯(lián)調的工作量。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

常用消息隊列

由于官方社區(qū)現(xiàn)在對 ActiveMQ 5.x 維護越來越少,較少在大規(guī)模吞吐的場景中使用,所以我們主要講解 Kafka、RabbitMQ 和 RocketMQ。

Kafka

Apache Kafka 最初由 LinkedIn 公司基于獨特的設計實現(xiàn)為一個分布式的提交日志系統(tǒng),之后成為 Apache 項目的一部分,號稱大數(shù)據(jù)的殺手锏,在數(shù)據(jù)采集、傳輸、存儲的過程中發(fā)揮著舉足輕重的作用。

它是一個分布式的,支持多分區(qū)、多副本,基于 Zookeeper 的分布式消息流平臺 ,它同時也是一款開源的基于發(fā)布訂閱模式的消息引擎系統(tǒng)。

重要概念

主題(Topic) :消息的種類稱為主題,可以說一個主題代表了一類消息,相當于是對消息進行分類,主題就像是數(shù)據(jù)庫中的表。

分區(qū)(partition) :主題可以被分為若干個分區(qū),同一個主題中的分區(qū)可以不在一個機器上,有可能會部署在多個機器上,由此來實現(xiàn) kafka 的伸縮性。

批次 :為了提高效率, 消息會分批次寫入 Kafka,批次就代指的是一組消息。

消費者群組(Consumer Group) :消費者群組指的就是由一個或多個消費者組成的群體。

Broker : 一個獨立的 Kafka 服務器就被稱為 broker,broker 接收來自生產者的消息,為消息設置偏移量,并提交消息到磁盤保存。

Broker 集群 :broker 集群由一個或多個 broker 組成。

重平衡(Rebalance) :消費者組內某個消費者實例掛掉后,其他消費者實例自動重新分配訂閱主題分區(qū)的過程。

Kafka 架構

一個典型的 Kafka 集群中包含 Producer、broker、Consumer Group、Zookeeper 集群。

Kafka 通過 Zookeeper 管理集群配置,選舉 leader,以及在 Consumer Group 發(fā)生變化時進行 rebalance。Producer 使用 push 模式將消息發(fā)布到 broker,Consumer 使用 pull 模式從 broker 訂閱并消費消息。

890f2110-5d7b-11ed-a3b6-dac502259ad0.png

Kafka 工作原理

消息經過序列化后,通過不同的分區(qū)策略,找到對應的分區(qū)。

相同主題和分區(qū)的消息,會被存放在同一個批次里 ,然后由一個獨立的線程負責把它們發(fā)到 Kafka Broker 上。

8952a976-5d7b-11ed-a3b6-dac502259ad0.png

分區(qū)的策略包括順序輪詢、隨機輪詢和 key hash 這 3 種方式,那什么是分區(qū)呢?

分區(qū)是 Kafka 讀寫數(shù)據(jù)的最小粒度,比如主題 A 有 15 條消息,有 5 個分區(qū),如果采用順序輪詢的方式,15 條消息會順序分配給這 5 個分區(qū),后續(xù)消費的時候,也是按照分區(qū)粒度消費。

89f75566-5d7b-11ed-a3b6-dac502259ad0.png

由于分區(qū)可以部署在多個不同的機器上,所以可以通過分區(qū)實現(xiàn) Kafka 的伸縮性,比如主題 A 的 5 個分區(qū),分別部署在 5 臺機器上,如果下線一臺,分區(qū)就變?yōu)?4。

Kafka 消費是通過消費群組完成,同一個消費者群組,一個消費者可以消費多個分區(qū),但是一個分區(qū),只能被一個消費者消費。

8a6a639e-5d7b-11ed-a3b6-dac502259ad0.png

如果消費者增加,會觸發(fā) Rebalance,也就是分區(qū)和消費者需要重新配對

不同的消費群組互不干涉 ,比如下圖的 2 個消費群組,可以分別消費這 4 個分區(qū)的消息,互不影響。

8a7bb16c-5d7b-11ed-a3b6-dac502259ad0.png

RocketMQ

RocketMQ 是阿里開源的消息中間件,它是純 Java 開發(fā),具有高性能、高可靠、高實時、適合大規(guī)模分布式系統(tǒng)應用的特點。

RocketMQ 思路起源于 Kafka,但并不是 Kafka 的一個 Copy,它對消息的可靠傳輸及事務性做了優(yōu)化 ,目前在阿里集團被廣泛應用于交易、充值、流計算、消息推送、日志流式處理、binlog 分發(fā)等場景。

重要概念

Name 服務器(NameServer) :充當注冊中心,類似 Kafka 中的 Zookeeper。

Broker : 一個獨立的 RocketMQ 服務器就被稱為 broker,broker 接收來自生產者的消息,為消息設置偏移量。

主題(Topic) :消息的第一級類型,一條消息必須有一個 Topic。

子主題(Tag) :消息的第二級類型,同一業(yè)務模塊不同目的的消息就可以用相同 Topic 和不同的 Tag 來標識。

分組(Group) :一個組可以訂閱多個 Topic,包括生產者組(Producer Group)和消費者組(Consumer Group)。

隊列(Queue) :可以類比 Kafka 的分區(qū) Partition。

RocketMQ 工作原理

RockerMQ 中的消息模型就是按照主題模型所實現(xiàn)的,包括 Producer Group、Topic、Consumer Group 三個角色。

為了提高并發(fā)能力,一個 Topic 包含多個 Queue ,生產者組根據(jù)主題將消息放入對應的 Topic,下圖是采用輪詢的方式找到里面的 Queue。

RockerMQ 中的消費群組和 Queue,可以類比 Kafka 中的消費群組和 Partition:不同的消費者組互不干擾,一個 Queue 只能被一個消費者消費,一個消費者可以消費多個 Queue。

消費 Queue 的過程中,通過偏移量記錄消費的位置。

8a8f7bc0-5d7b-11ed-a3b6-dac502259ad0.png

RocketMQ 架構

RocketMQ 技術架構中有四大角色 NameServer、Broker、Producer 和 Consumer,下面主要介紹 Broker。

Broker 用于存放 Queue,一個 Broker 可以配置多個 Topic,一個 Topic 中存在多個 Queue。

如果某個 Topic 消息量很大,應該給它多配置幾個 Queue,并且盡量多分布在不同 broker 上,以減輕某個 broker 的壓力。Topic 消息量都比較均勻的情況下,如果某個 broker 上的隊列越多,則該 broker 壓力越大。

8aa69954-5d7b-11ed-a3b6-dac502259ad0.jpg

簡單提一下,Broker 通過集群部署,并且提供了 master/slave 的結構,slave 定時從 master 同步數(shù)據(jù)(同步刷盤或者異步刷盤),如果 master 宕機,則 slave 提供消費服務,但是不能寫入消息。

看到這里,大家應該可以發(fā)現(xiàn),RocketMQ 的設計和 Kafka 真的很像!

RabbitMQ

RabbitMQ 2007 年發(fā)布,是使用 Erlang 語言開發(fā)的開源消息隊列系統(tǒng),基于 AMQP 協(xié)議來實現(xiàn)。

AMQP 的主要特征是面向消息、隊列、路由、可靠性、安全。AMQP 協(xié)議更多用在企業(yè)系統(tǒng)內,對數(shù)據(jù)一致性、穩(wěn)定性和可靠性要求很高的場景,對性能和吞吐量的要求還在其次。

重要概念

信道(Channel) :消息讀寫等操作在信道中進行,客戶端可以建立多個信道,每個信道代表一個會話任務。

交換器(Exchange) :接收消息,按照路由規(guī)則將消息路由到一個或者多個隊列;如果路由不到,或者返回給生產者,或者直接丟棄。

路由鍵(RoutingKey) :生產者將消息發(fā)送給交換器的時候,會發(fā)送一個 RoutingKey,用來指定路由規(guī)則,這樣交換器就知道把消息發(fā)送到哪個隊列。

綁定(Binding) :交換器和消息隊列之間的虛擬連接,綁定中可以包含一個或者多個 RoutingKey。

RabbitMQ 工作原理

AMQP 協(xié)議模型由三部分組成:生產者、消費者和服務端,執(zhí)行流程如下:

生產者是連接到 Server,建立一個連接,開啟一個信道。

生產者聲明交換器和隊列,設置相關屬性,并通過路由鍵將交換器和隊列進行綁定。

消費者也需要進行建立連接,開啟信道等操作,便于接收消息。

生產者發(fā)送消息,發(fā)送到服務端中的虛擬主機。

虛擬主機中的交換器根據(jù)路由鍵選擇路由規(guī)則,發(fā)送到不同的消息隊列中。

訂閱了消息隊列的消費者就可以獲取到消息,進行消費。

8abcc526-5d7b-11ed-a3b6-dac502259ad0.png

常用交換器

RabbitMQ 常用的交換器類型有 direct、topic、fanout、headers 四種。

具體的使用方法,可以參考官網(wǎng):

官網(wǎng)入口:https://www.rabbitmq.com/getstarted.html

8aebc678-5d7b-11ed-a3b6-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://gitee.com/zhijiantianya/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

消息隊列對比&選型

8b37886a-5d7b-11ed-a3b6-dac502259ad0.png

消息隊列對比

Kafka

優(yōu)點:

高吞吐、低延遲 :Kafka 最大的特點就是收發(fā)消息非???,Kafka 每秒可以處理幾十萬條消息,它的最低延遲只有幾毫秒;

高伸縮性 :每個主題(topic)包含多個分區(qū)(partition),主題中的分區(qū)可以分布在不同的主機(broker)中;

高穩(wěn)定性 :Kafka 是分布式的,一個數(shù)據(jù)多個副本,某個節(jié)點宕機,Kafka 集群能夠正常工作;

持久性、可靠性、可回溯 :Kafka 能夠允許數(shù)據(jù)的持久化存儲,消息被持久化到磁盤,并支持數(shù)據(jù)備份防止數(shù)據(jù)丟失,支持消息回溯;

消息有序:通過控制能夠保證所有消息被消費且僅被消費一次;

有優(yōu)秀的第三方 Kafka Web 管理界面 Kafka-Manager,在日志領域比較成熟,被多家公司和多個開源項目使用。

缺點:

Kafka 單機超過 64 個隊列/分區(qū),Load 會發(fā)生明顯的飆高現(xiàn)象,隊列越多,load 越高,發(fā)送消息響應時間變長;

不支持消息路由,不支持延遲發(fā)送,不支持消息重試;

社區(qū)更新較慢。

RocketMQ

優(yōu)點:

高吞吐 :借鑒 Kafka 的設計,單一隊列百萬消息的堆積能力;

高伸縮性 :靈活的分布式橫向擴展部署架構,整體架構其實和 kafka 很像;

高容錯性 :通過ACK機制,保證消息一定能正常消費;

持久化、可回溯 :消息可以持久化到磁盤中,支持消息回溯;

消息有序:在一個隊列中可靠的先進先出(FIFO)和嚴格的順序傳遞;

支持發(fā)布/訂閱和點對點消息模型,支持拉、推兩種消息模式;

提供 docker 鏡像用于隔離測試和云集群部署,提供配置、指標和監(jiān)控等功能豐富的 Dashboard。

缺點:

不支持消息路由,支持的客戶端語言不多,目前是 java 及 c++,其中 c++ 不成熟

部分支持消息有序:需要將同一類的消息 hash 到同一個隊列 Queue 中,才能支持消息的順序,如果同一類消息散落到不同的 Queue中,就不能支持消息的順序。

社區(qū)活躍度一般。

RabbitMQ

優(yōu)點:

支持幾乎所有最受歡迎的編程語言 :Java,C,C ++,C#,Ruby,Perl,Python,PHP等等;

支持消息路由 :RabbitMQ 可以通過不同的交換器支持不同種類的消息路由;

消息時序 :通過延時隊列,可以指定消息的延時時間,過期時間TTL等;

支持容錯處理:通過交付重試和死信交換器(DLX)來處理消息處理故障;

提供了一個易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker;

社區(qū)活躍度高。

缺點:

Erlang 開發(fā),很難去看懂源碼,不利于做二次開發(fā)和維護 ,基本只能依賴于開源社區(qū)的快速維護和修復 bug;

RabbitMQ 吞吐量會低一些 ,這是因為他做的實現(xiàn)機制比較重;

不支持消息有序、持久化不好、不支持消息回溯、伸縮性一般。

消息隊列選型

Kafka:追求高吞吐量,一開始的目的就是用于日志收集和傳輸,適合產生大量數(shù)據(jù)的互聯(lián)網(wǎng)服務的數(shù)據(jù)收集業(yè)務 ,大型公司建議可以選用,如果有日志采集功能,肯定是首選 kafka。

RocketMQ:天生為金融互聯(lián)網(wǎng)領域而生,對于可靠性要求很高的場景 ,尤其是電商里面的訂單扣款,以及業(yè)務削峰,在大量交易涌入時,后端可能無法及時處理的情況。RocketMQ 在穩(wěn)定性上可能更值得信賴,這些業(yè)務場景在阿里雙 11 已經經歷了多次考驗,如果你的業(yè)務有上述并發(fā)場景,建議可以選擇 RocketMQ。

RabbitMQ:結合 erlang 語言本身的并發(fā)優(yōu)勢,性能較好,社區(qū)活躍度也比較高,但是不利于做二次開發(fā)和維護,不過 RabbitMQ 的社區(qū)十分活躍,可以解決開發(fā)過程中遇到的 bug。如果你的數(shù)據(jù)量沒有那么大,小公司優(yōu)先選擇功能比較完備的 RabbitMQ。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8958

    瀏覽量

    85081
  • 交換器
    +關注

    關注

    2

    文章

    90

    瀏覽量

    16511
  • 虛擬機
    +關注

    關注

    1

    文章

    904

    瀏覽量

    28018
  • AMQP
    +關注

    關注

    0

    文章

    6

    瀏覽量

    2547

原文標題:消息隊列原理和選型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    淺析RFID中間件

    ,最重要的是要有關鍵的應用軟件(Killer Application),才能迅速推廣。而中間件(Middleware)可稱為是RFID運作的中樞,因為它可以加速關鍵應用的問世。
    發(fā)表于 07-10 08:03

    為什么要使用消息隊列?消息隊列的優(yōu)缺點

    由于項目需要,在嵌入式操作系統(tǒng)的中間件設計中,采用了消息隊列來作為各個模塊之間的通信方式,同時允許用戶層的不同用戶來訪問中間件的各個模塊。 現(xiàn)在列出下面三個問題來加深對消息隊列的理解,
    發(fā)表于 12-22 06:28

    中間件消息隊列的建模與實現(xiàn)

    論述了面向消息中間件的建模方法,并簡要討論了該模型在Client/ Server 環(huán)境中的具體實現(xiàn)。實驗證明,這種模型的實現(xiàn)可以彌補DEC MessageQ 在動態(tài)資源管理上的不足。關鍵詞:中
    發(fā)表于 03-25 17:03 ?19次下載

    支持多服務的消息中間件設計與實現(xiàn)

    為了解決消息中間件中的性能瓶頸問題和實現(xiàn)其可靠性的提高,研究并開發(fā)了支持多服務的消息中間件,提供單個節(jié)點無法提供的性能和可靠性保障。消息集群設計過程中涉及的主
    發(fā)表于 08-06 10:04 ?26次下載

    基于JMS的RFID中間件設計與實現(xiàn)

    介紹了Radio Frequency Identification (RFID) 和物聯(lián)網(wǎng)的RFID 中間件技術,設計了RFID 中間件整體框架,在此基礎上設計并實現(xiàn)了一個基于JMS 的商品零售的邊緣中間件
    發(fā)表于 10-19 16:16 ?17次下載

    什么是中間件

    什么是中間件 中間件是一種獨立的系統(tǒng)軟件或服務程序,分布式應用軟件
    發(fā)表于 12-28 17:54 ?1361次閱讀
    什么是<b class='flag-5'>中間件</b>

    NGB中間件標準考慮因素

      數(shù)字電視中間件技術與標準,大家都非常熟悉了。自2001年,DVB推出MHP中間件技術標準以來,全世界各地都開始了中間件技術的研究與標準制定工作,而且基本上都是源自于MHP
    發(fā)表于 06-25 11:18 ?1077次閱讀
    NGB<b class='flag-5'>中間件</b>標準考慮因素

    基于ARM平臺的RFID中間件系統(tǒng)設計

    基于ARM平臺的RFID中間件系統(tǒng)設計
    發(fā)表于 01-12 22:16 ?15次下載

    常見的中間件有哪些?匯總解析

    世界著名的資訊機構Giga Group把中間件分為三大類,共十五種。另一家世界著名的資訊機構IDC同時指出,最近幾年到未來的2002年,增長率最高的中間件將集中在數(shù)據(jù)存取中間件、消息中間件
    發(fā)表于 12-01 08:48 ?5.4w次閱讀

    功能分布式結構的發(fā)布/訂閱模式測控消息中間件系統(tǒng)

    在航天測控領域,消息中間件主要用于保證測控中心計算機系統(tǒng)各功能子系統(tǒng)之間基于異構硬件和軟件平臺的信息交換。傳統(tǒng)測控消息中間件的實現(xiàn)模式有點對點、消息隊列、遠程過程調用和共享內存等。發(fā)布/訂閱
    發(fā)表于 01-16 10:23 ?0次下載
    功能分布式結構的發(fā)布/訂閱模式測控消息<b class='flag-5'>中間件</b>系統(tǒng)

    RFID中間件是什么東西

    RFID 中間件是一種面向消息的中間件,信息是以消息的形式,從一個程序傳送到另一個或多個程序。
    發(fā)表于 12-02 16:12 ?3410次閱讀

    基于SOA的RFID中間件如何來設計

    RFID中間件是一種消息導向的軟件中間件,信息是以消息的形式從一個程序模塊傳遞到另一個或多個程序模塊。
    發(fā)表于 01-07 16:22 ?721次閱讀
    基于SOA的RFID<b class='flag-5'>中間件</b>如何來設計

    Redis 延時隊列,一次性搞明白

    ,對于專業(yè)的消息隊列中間件,如Kafka和RabbitMQ,消費者在消費消息之前要進行一系列的繁瑣過程。 如RabbitMQ發(fā)消息之前要創(chuàng)建 Exchange,再創(chuàng)建 Queue,還要將 Queue 和 Exchange 通過某種規(guī)則綁定起來,發(fā)消息的時候要指定 rout
    的頭像 發(fā)表于 10-30 16:34 ?2110次閱讀
    Redis 延時<b class='flag-5'>隊列</b>,一次性搞明白

    消息隊列經典十連問

    我們通常說的消息隊列,簡稱MQ(Message Queue),它其實就指消息中間件,當前業(yè)界比較流行的開源消息中間件包括:RabbitMQ、RocketMQ、Kafka。
    的頭像 發(fā)表于 03-22 10:08 ?1234次閱讀

    通信中間件接口手冊

    通信中間件接口手冊
    發(fā)表于 06-29 11:37 ?2次下載