打開一個網(wǎng)站在建設(shè)中知乎營銷推廣
一、什么是MQ
MQ(MessageQueue)
Message(消息):消息是在不同進程之間傳遞的數(shù)據(jù),這些進程可以在同一臺機器上,也可以在不同的機器上。
Queue(隊列):隊列原意是指一種具有FIFO(先進先出)特性的數(shù)據(jù)結(jié)構(gòu),是用來緩存數(shù)據(jù)的。
我們要學習的MQ產(chǎn)品對接的使用對象是應(yīng)用程序。
它是一種在應(yīng)用程序之間傳遞消息的通信方式,通過將消息發(fā)送到中間件(消息隊列)來實現(xiàn)解耦和異步處理。消息隊列允許發(fā)送者將消息放入隊列中,而接收者可以從隊列中獲取消息進行處理。這種方式可以提高系統(tǒng)的可靠性、擴展性和靈活性,同時降低系統(tǒng)之間的依賴性和耦合度。常見的消息隊列系統(tǒng)有RabbitMQ、Apache Kafka、RocketMQ。
二、MQ有什么作用
MQ的主要作用包括:
-
異步通信:通過消息隊列,發(fā)送者和接收者之間的通信可以變?yōu)楫惒椒绞?#xff0c;發(fā)送者將消息放入隊列后即可繼續(xù)處理其他任務(wù),而不需要等待接收者的響應(yīng)。這能提高系統(tǒng)響應(yīng)時間
-
解耦合:使用消息隊列可以將不同模塊或服務(wù)之間的耦合度降低。發(fā)送者只需要將消息發(fā)送到隊列中,而不需要關(guān)心具體的接收者是誰,接收者也可以從隊列中獲取消息進行處理,而不需要知道消息的來源。當下游服務(wù)出現(xiàn)問題無法提供服務(wù)時,不會影響到上游服務(wù)繼續(xù)提供服務(wù),這一點在分布式系統(tǒng)中尤為重要。
-
緩沖和削峰:當發(fā)送者產(chǎn)生大量請求時,消息隊列可以作為緩沖區(qū),暫時存儲這些請求,然后由接收者按照自己的處理能力逐個處理。同時,當請求過多導致系統(tǒng)壓力過大時,消息隊列可以平滑地削峰,避免系統(tǒng)崩潰或性能下降。
三、MQ介紹及選型
RabbitMQ
- 遵從AMQP協(xié)議
AMQP簡單來說就是規(guī)定好了MQ的各個抽象組件,使得很好被開源框架所集成,比如Spring AMQP專門就是用來操作AMQP架構(gòu)的中間件的,因此RabbitMQ可以被Spring Boot很方便的集成。 - 豐富的消費模型:Fanout(廣播)、direct(精確路由)、topic(模糊路由)
- 消息延遲低(微秒級)
- 吞吐量不高
- 使用erlang語言,使得其根據(jù)業(yè)務(wù)進行二次開發(fā)的成本比較高
RocketMQ
RocketMQ出自阿里公司的開源產(chǎn)品,用 Java 語言實現(xiàn),在設(shè)計時參考了 Kafka,并做出了自己的一些改進,消息可靠性上比 Kafka 更好。RocketMQ在阿里集團被廣泛應(yīng)用在訂單,交易,充值,流計算,消息推送,日志流式處理,binglog分發(fā)等場景。
- 天生的分布式架構(gòu)
- 消息可靠性和吞吐量都很高,以及豐富的消息消費模式使他適用于大多數(shù)業(yè)務(wù)場景
Kafka
Apache Kafka是一個分布式消息發(fā)布訂閱系統(tǒng)。它最初由LinkedIn公司基于獨特的設(shè)計實現(xiàn)為一個分布式的提交日志系統(tǒng)( a distributed commit log),之后成為Apache項目的一部分。Kafka系統(tǒng)快速、可擴展并且可持久化。它的分區(qū)特性,可復制和可容錯都是其不錯的特性。
- Kafka的設(shè)計目標是實現(xiàn)高吞吐量的消息傳遞,適用于處理大量的實時數(shù)據(jù)流。
- 支持的消費模式比較單一
具體企業(yè)開發(fā)中使用如何呢?
Kafka 一開始的目的就是用于日志收集和傳輸,適合有大量數(shù)據(jù)產(chǎn)生的互聯(lián)網(wǎng)業(yè)務(wù),特別是大數(shù)據(jù)領(lǐng)域的實時計算、日志采集等場景,用 Kafka 絕對沒錯,社區(qū)活躍度高,業(yè)內(nèi)標準。
RocketMQ 特別適用于金融互聯(lián)網(wǎng)領(lǐng)域這類對于可靠性要求很高的場景,比如訂單交易等,而且 RocketMQ 是阿里出品的,經(jīng)歷過那么多次淘寶雙十一的考驗,大品牌,在穩(wěn)定性值得信賴。但如果阿里不再維護這個技術(shù)了,社區(qū)有可能突然黃掉的風險。因此如果公司對自己的技術(shù)實力有自信,基礎(chǔ)架構(gòu)研發(fā)實力較強,推薦用 RocketMQ。
RabbitMQ 適用于公司對外提供能力,可能會有很多主題接入的中臺業(yè)務(wù)場景,畢竟它是百萬級主題數(shù)的。它的時效性是毫秒級的,但實際毫秒級和微秒級在感知上沒有什么太大的區(qū)別,所以它的這一大優(yōu)點并不太會作為考量標準。同時,它的功能是比較完善的,開源社區(qū)活躍度高,能解決開發(fā)中遇到的bug,所以萬級別數(shù)據(jù)量業(yè)務(wù)場景的小公司可以優(yōu)先選擇功能完善的RabbitMQ。它的缺點就是用 Erlang 語言編寫,所以很多開發(fā)人員很難去看懂源碼并進行二次開發(fā)和維護,也就是說對于公司來說可能處于不可控的狀態(tài)。
RocketMQ的核心部分概述
生產(chǎn)者(Producer)
RocketMQ生產(chǎn)者是消息的發(fā)送方,用于向RocketMQ中的主題發(fā)布消息。生產(chǎn)者負責將消息發(fā)送到指定的主題,并將消息傳遞給訂閱該主題的消費者進行消費。
消費者(Consumer)
RocketMQ消費者是消息的接收方,用于從RocketMQ中的主題訂閱消息并進行消費。消費者負責從指定的主題中拉取消息或者監(jiān)聽隊列,然后對消息進行處理。
消費者組(ConsumerGroup)
- 為了消費能力的水平擴展,ConsumerGroup的概念應(yīng)運而生。
RocketMQ消費者組是一組具有相同消費邏輯的消費者實例的集合。在RocketMQ中,一個主題可以由多個消費者組進行訂閱和消費。
消費者組的主要作用是實現(xiàn)消息的負載均衡和容錯能力。當一個主題有多個消費者組時,RocketMQ會將該主題的消息分配給各個消費者組進行處理。每個消費者組內(nèi)的消費者實例則共同承擔該組內(nèi)消息的消費任務(wù)。這樣做的好處是能夠提高消息的消費速度和并發(fā)處理能力。
主題(Topic)
- 標識消息分類:RocketMQ的主題用于對消息進行分類和組織。通過為不同類型的消息分配不同的主題,可以使消息更具可讀性和可管理性。
- 獨立的消息隊列:每個主題都有自己的消息隊列,用于存儲該主題下的消息。每個隊列都可以并行地接收和處理消息,從而實現(xiàn)高吞吐量和負載均衡。
- 消息路由:生產(chǎn)者在發(fā)送消息時指定目標主題,消費者則通過訂閱感興趣的主題來接收對應(yīng)的消息。RocketMQ根據(jù)主題將消息路由到相應(yīng)的隊列上,然后再由消費者消費。
NameServer
RocketMQ的NameServer是一個用于管理和維護消息隊列的元數(shù)據(jù)信息的組件。它是RocketMQ的核心組件之一,負責記錄每個Topic的路由信息和Broker的狀態(tài)信息。
Broker
在RocketMQ中,Broker是消息隊列的核心組件之一。它負責存儲和轉(zhuǎn)發(fā)消息,并提供消息的發(fā)布和訂閱功能。他是一個物理概念,你可以認為他是一個服務(wù)節(jié)點。
MessageQueue
定義: 隊列是 Apache RocketMQ 中消息存儲和傳輸?shù)膶嶋H容器,也是 Apache RocketMQ 消息的最小存儲單元。 Apache RocketMQ 的所有主題都是由多個隊列組成,以此實現(xiàn)隊列數(shù)量的水平拆分和隊列內(nèi)部的流式存儲。
為了消息寫入能力的水平擴展,RocketMQ 對 Topic進行了分區(qū),這種操作被稱為隊列(MessageQueue)。
對于RocketMQ同一個消費者組下的多個consumer需要與topic下的messagequeue建立對應(yīng)關(guān)系,而一個messagequeue只能被一個consumer進行消費。因此增加的Conusmer實例最多也只能和Topic下的MessageQueue數(shù)量相等,如果繼續(xù)增加就會有消費者空閑。