消息隊(duì)列MessageQueue最全詳解(MQ萬字圖文總結(jié))
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
消息隊(duì)列是大型高并發(fā)架構(gòu)的核心,也是大廠重點(diǎn)考察的對(duì)象,下面我就全面來詳解消息隊(duì)列。 消息隊(duì)列消息隊(duì)列,全稱是:“MessageQueue”,很多時(shí)候我們也簡(jiǎn)稱為:“ MQ”,本質(zhì)就是一個(gè)保存消息的隊(duì)列。 如下圖所示: 允許不同的應(yīng)用程序通過發(fā)送、和接收消息進(jìn)行數(shù)據(jù)交換,從而實(shí)現(xiàn)系統(tǒng)解耦、提高系統(tǒng)可擴(kuò)展性、和性能。 主要解決以下幾點(diǎn)問題: 1.異步通信 異步通信是指:系統(tǒng)中的組件通過消息隊(duì)列,進(jìn)行異步消息傳遞,發(fā)送者不需要等待接收者處理完畢,即可繼續(xù)執(zhí)行其他任務(wù)。 比如:郵件服務(wù)異步發(fā)送郵件給用戶,注冊(cè)服務(wù)立即返回響應(yīng)給用戶,而不必等待郵件發(fā)送完成,這就是典型的”異步通信“。 2.解耦 消息隊(duì)列使生產(chǎn)者,和消費(fèi)者之間解耦,生產(chǎn)者只需將消息發(fā)送到消息隊(duì)列中,而不需要知道消息的最終處理者是誰。 這種解耦使得系統(tǒng)組件之間的依賴關(guān)系減少,提高了系統(tǒng)的靈活性、和可維護(hù)性。 3.可靠性 消息隊(duì)列可以保證消息的可靠傳輸,比如:可以通過持久化、和確認(rèn)機(jī)制,確保消息不丟失。 4.流量削峰 消息隊(duì)列可以緩解突發(fā)流量對(duì)系統(tǒng)的壓力,比如:在搶購(gòu)活動(dòng)中,訂單請(qǐng)求量在短時(shí)間內(nèi)激增。 消息隊(duì)列:可以暫存這些訂單請(qǐng)求,后臺(tái)服務(wù)按能力逐步處理,防止系統(tǒng)癱瘓,這就是典型的”流量削峰“。 總之,消息隊(duì)列可以用于:解耦、異步處理、削峰填谷、和可靠傳輸...等場(chǎng)景,使得它在現(xiàn)代分布式系統(tǒng)、和微服務(wù)架構(gòu)中成為關(guān)鍵組件。 消息隊(duì)列原理消息隊(duì)列的實(shí)現(xiàn),如下圖所示: MQ的整體架構(gòu)通常包括以下幾個(gè)組件: 生產(chǎn)者(Producer): 生產(chǎn)者:是負(fù)責(zé)生成、和發(fā)送消息到消息隊(duì)列的應(yīng)用程序、或組件。 生產(chǎn)者可以是任何生成數(shù)據(jù)的系統(tǒng)部分,比如:用戶操作觸發(fā)的事件、定時(shí)任務(wù)、數(shù)據(jù)采集系統(tǒng)。。。等。 還是舉一個(gè)例子:在電子商務(wù)系統(tǒng)中,訂單服務(wù)在用戶提交訂單后生成訂單消息,并將其發(fā)送到訂單處理隊(duì)列中,這就是生產(chǎn)者。 消息代理(Broker): 生產(chǎn)者將生成的消息,發(fā)送到消息代理(Broker),并指定消息應(yīng)存儲(chǔ)的隊(duì)列、或主題。 這里的代理(Broker):就是負(fù)責(zé)消息接收、存儲(chǔ)、和分發(fā)消息的中間件。
消息隊(duì)列(Queue): queue就是:存儲(chǔ)消息的容器,按照一定順序傳遞消息。 消費(fèi)者(Consumer): 這個(gè)沒什么可說的,就是消費(fèi)者:從消息隊(duì)列讀取并處理消息的應(yīng)用程序、或組件。 消息體(Message): 消息的內(nèi)容,包括消息頭(metadata)和消息體(payload)。
消息冪等性 除了考慮上面的設(shè)計(jì)外,還需要考到如何避免重復(fù)處理。 比如:如何確保消費(fèi)者處理消息時(shí)具備冪等性,即同一消息多次處理不會(huì)造成副作用。 可以通過消息ID、狀態(tài)記錄等手段實(shí)現(xiàn)冪等性。 去重策略 對(duì)于可能重復(fù)的消息,設(shè)計(jì)去重策略,確保同一消息只被處理一次。 消息隊(duì)列類型消息隊(duì)列主要包含兩種,一個(gè)是”點(diǎn)對(duì)點(diǎn)“,一個(gè)是”發(fā)布訂閱模型“。 1.點(diǎn)對(duì)點(diǎn) 在點(diǎn)對(duì)點(diǎn)模型中,消息在隊(duì)列中存儲(chǔ),只有一個(gè)消費(fèi)者可以消費(fèi)該消息,一旦消息被消費(fèi),它就會(huì)從隊(duì)列中移除。 應(yīng)用場(chǎng)景:
2.發(fā)布/訂閱 在發(fā)布訂閱模型中,消息發(fā)布者將消息發(fā)送到主題(Topic),所有訂閱該主題的消費(fèi)者都可以接收到消息。 如下圖所示: 每條消息可以被多個(gè)消費(fèi)者消費(fèi),消息不會(huì)因?yàn)楸荒硞€(gè)消費(fèi)者讀取而刪除。 發(fā)布訂閱模型包含三個(gè)角色:
應(yīng)用場(chǎng)景:
3.點(diǎn)對(duì)點(diǎn)模式和發(fā)布訂閱模式的區(qū)別主要體現(xiàn)在如下3點(diǎn): 1、消息接收者的區(qū)別 點(diǎn)對(duì)點(diǎn):每條消息只被一個(gè)消費(fèi)者接收和處理。 發(fā)布訂閱:每條消息可以被,多個(gè)訂閱者接收、和處理。 2、消息存儲(chǔ)方式的區(qū)別 點(diǎn)對(duì)點(diǎn):消息存儲(chǔ)在隊(duì)列中,消費(fèi)者讀取后消息從隊(duì)列中刪除。 發(fā)布訂閱:消息存儲(chǔ)在主題中,所有訂閱者接收完消息后消息才會(huì)刪除。 3、適用場(chǎng)景的區(qū)別 點(diǎn)對(duì)點(diǎn):適用于需要保證消息只處理一次的場(chǎng)景,如:任務(wù)處理、訂單處理。 發(fā)布訂閱:適用于需要廣播消息的場(chǎng)景,如:日志收集、事件通知。 常用的消息隊(duì)列?以下是一些常用的消息隊(duì)列系統(tǒng): 1.RabbitMQ RabbitMQ是基于AMQP協(xié)議的開源消息代理,具有高可靠性、靈活的路由功能和豐富的插件。 采用Erlang語(yǔ)言開發(fā),支持集群和高可用性配置。 廣泛應(yīng)用于微服務(wù)架構(gòu)、異步通信、消息分發(fā)和實(shí)時(shí)數(shù)據(jù)處理。 2.Apache Kafka Kafka是Apache的分布式流處理平臺(tái),具有高吞吐量、低延遲、持久化和水平擴(kuò)展能力。 架構(gòu):采用分區(qū)和副本機(jī)制,保證高可用和數(shù)據(jù)可靠性。 應(yīng)用:適用于實(shí)時(shí)數(shù)據(jù)流處理、日志收集、事件驅(qū)動(dòng)系統(tǒng)和大數(shù)據(jù)分析。 性能:極高的吞吐量和低延遲,適用于大規(guī)模數(shù)據(jù)流處理、和分析場(chǎng)景。 3.ActiveMQ ActiveMQ是Apache基金會(huì)的開源消息中間件,支持JMS規(guī)范,具有高性能、可靠性和靈活性。 適用于中等到高負(fù)載的場(chǎng)景,性能較為穩(wěn)定,但在高吞吐量場(chǎng)景下不如Kafka。 4.RocketMQ RocketMQ是Apache的分布式消息中間件,最早是阿里開發(fā)的,具有高性能、低延遲、可靠性和水平擴(kuò)展性。 架構(gòu):基于分布式架構(gòu),支持順序消息、事務(wù)消息和定時(shí)消息。 應(yīng)用:廣泛應(yīng)用于金融、電子商務(wù)和大數(shù)據(jù)領(lǐng)域。 性能:高吞吐量和低延遲,適用于大規(guī)模消息處理和傳輸。 5.Apache Pulsar Pulsar是Apache的分布式消息流平臺(tái),支持多租戶、水平擴(kuò)展和低延遲。 采用多層架構(gòu),分為存儲(chǔ)層和計(jì)算層,支持分區(qū)和副本機(jī)制。 適用于實(shí)時(shí)數(shù)據(jù)處理、日志收集和事件流處理,具有高吞吐量、低延遲,適用于大規(guī)模實(shí)時(shí)數(shù)據(jù)流處理。 閱讀原文:原文鏈接 該文章在 2025/7/2 0:01:11 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |