柚子快報(bào)邀請(qǐng)碼778899分享:分布式 RabbitMQ詳情
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 RabbitMQ詳情
一.MQ簡(jiǎn)介
什么是MQ
MQ本質(zhì)是隊(duì)列,F(xiàn)IFO先入先出,隊(duì)列中存放的內(nèi)容是message(消息),還是一種跨進(jìn)程的通信機(jī)制,用于上下游傳遞消息。在互聯(lián)網(wǎng)架構(gòu)中是常見(jiàn)的上下游“邏輯解耦+物理解耦”的消息通信服務(wù)。 主要用來(lái)實(shí)現(xiàn)流量削峰,應(yīng)用解耦,異步處理等系統(tǒng)優(yōu)化方案
為什么使用MQ
流量削峰: 例如:處理訂單系統(tǒng)中能最大處理1萬(wàn)次訂單,但在高峰期處理2萬(wàn)次訂單處理不過(guò)來(lái),只能限制1萬(wàn)次訂單后的訂單不能下單。那么有消息隊(duì)列做緩沖就很好的解決這個(gè)問(wèn)題,將這1秒內(nèi)的訂單分一段時(shí)間處理,意思沒(méi)能處理的放在隊(duì)列中等待直到處理完,這樣比不能下單體驗(yàn)感好。應(yīng)用解耦: 在電商系統(tǒng)中有訂單系統(tǒng),庫(kù)存系統(tǒng),物流系統(tǒng),支付系統(tǒng),如果耦合調(diào)用它們?nèi)魏我粋€(gè)子系統(tǒng)出故障下單會(huì)造成異常,這時(shí)使用消息隊(duì)列后,用幾分鐘解決完故障后,繼續(xù)處理訂單,客戶感受不到系統(tǒng)的故障,提升系統(tǒng)的可用性。異步處理: 有些服務(wù)間是異步的 例如:A調(diào)用B,B花很長(zhǎng)時(shí)間處理完,A不知道B什么時(shí)候處理完 以前方式解決:A過(guò)一段時(shí)間去調(diào)用B的API查詢,或A提供一個(gè)callback api,B執(zhí)行完調(diào)用API通知A服務(wù)。 使用消息總線后:A調(diào)用完B后,只需監(jiān)聽(tīng)B處理完的消息,B處理完會(huì)發(fā)一條消息給MQ,MQ將此消息轉(zhuǎn)發(fā)給A服務(wù)。
AMQP和JMS
MQ是消息通信的模型,并發(fā)具體實(shí)現(xiàn)?,F(xiàn)在實(shí)現(xiàn)MQ的有兩種主流方式:AMQP、JMS。 兩者間的區(qū)別和聯(lián)系: JMS是定義了統(tǒng)一的接口,來(lái)對(duì)消息操作進(jìn)行統(tǒng)一;AMQP是通過(guò)規(guī)定協(xié)議來(lái)統(tǒng)一數(shù)據(jù)交互的格式 JMS限定了必須使用Java語(yǔ)言;AMQP只是協(xié)議,不規(guī)定實(shí)現(xiàn)方式,因此是跨語(yǔ)言的。 JMS規(guī)定了兩種消息模型;而AMQP的消息模型更加豐富
常見(jiàn)MQ產(chǎn)品
ActiveMQ:基于JMSRabbitMQ:基于AMQP協(xié)議,erlang語(yǔ)言開(kāi)發(fā),穩(wěn)定性好RocketMQ:基于JMS,阿里巴巴產(chǎn)品,目前交由Apache基金會(huì)Kafka:分布式消息系統(tǒng),高吞吐量
二.RabbitMQ(消息隊(duì)列)
選用RabbitMQ
在消息隊(duì)列產(chǎn)品的選擇上,我選用了RabbitMQ。估計(jì)有很多同學(xué)質(zhì)疑,為什么不選擇Kafka呢?這里我需要解釋幾句。 消息隊(duì)列產(chǎn)品有很多,比如說(shuō)常見(jiàn)的有RocketMQ、RabbitMQ、ActiveMQ和Kafka。其中Kafka的性能是最好的,并發(fā)量比較大,而且消息收發(fā)的速度也非??臁5窍⑹瞻l(fā)的可靠性上,Kafka不如RabbitMQ,而且技術(shù)選型的時(shí)候執(zhí)行速度并不是唯一標(biāo)準(zhǔn)。比速度的話,匯編語(yǔ)言碾壓一切高級(jí)語(yǔ)言,但是現(xiàn)在我們寫程序幾乎不會(huì)選用匯編語(yǔ)言,而是要兼顧開(kāi)發(fā)效率、易用性和生態(tài)圈。RabbitMQ還有另外一個(gè)殺手锏,那就是既支持消息異步收發(fā),又支持同步收發(fā),這個(gè)太牛了。雖然我們現(xiàn)在大部分的場(chǎng)景對(duì)應(yīng)的是消息異步收發(fā),但是有的場(chǎng)合要支持消息的同步收發(fā),這時(shí)候RabbitMQ能適應(yīng)各種業(yè)務(wù)場(chǎng)景的優(yōu)點(diǎn)就顯現(xiàn)出來(lái)了。所以在項(xiàng)目立項(xiàng)的時(shí)候,選擇RabbitMQ是最穩(wěn)妥的方案。
RabbitMQ概念
RabbitMQ是由erlang語(yǔ)言開(kāi)發(fā)的,基于AMQP協(xié)議完成的消息隊(duì)列,是一種應(yīng)用程序之間通信是一個(gè)消息中間件,簡(jiǎn)單理解就是你發(fā)送一個(gè)包裹到快遞站(RabbitMQ),然后這個(gè)快遞站把包裹發(fā)送到目的地。RabbitMQ知識(shí)接收,存儲(chǔ),轉(zhuǎn)發(fā)消息數(shù)據(jù)。
可靠性和可擴(kuò)展性:
強(qiáng)調(diào) RabbitMQ 的可靠性特性,如消息持久化和消息確認(rèn)機(jī)制,以確保消息不會(huì)丟失。提及 RabbitMQ 的可擴(kuò)展性,可以通過(guò)添加更多的節(jié)點(diǎn)和集群來(lái)處理大量的消息負(fù)載。
用途和優(yōu)點(diǎn):
提到 RabbitMQ 在分布式系統(tǒng)中的常見(jiàn)用途,如異步任務(wù)處理、事件驅(qū)動(dòng)架構(gòu)、微服務(wù)通信等。強(qiáng)調(diào) RabbitMQ 的優(yōu)點(diǎn),包括可靠性、靈活的路由規(guī)則、豐富的功能和社區(qū)支持。
AMQP(高級(jí)消息隊(duì)列協(xié)議):
AMQP(Advanced Message Queuing Protocol)是一種高級(jí)消息隊(duì)列協(xié)議,用于在應(yīng)用程序之間可靠地傳遞消息。它是一種開(kāi)放標(biāo)準(zhǔn)協(xié)議,旨在提供統(tǒng)一的消息傳遞機(jī)制,使不同的應(yīng)用程序或服務(wù)能夠相互通信。 以下是關(guān)于 AMQP 的一些要點(diǎn):
標(biāo)準(zhǔn)化協(xié)議: AMQP 是一個(gè)標(biāo)準(zhǔn)化協(xié)議,由多個(gè)參與者共同制定,其中最著名的是 AMQP 0-9-1 版本。該協(xié)議定義了消息傳遞的格式、交換機(jī)和隊(duì)列的行為,以及客戶端和代理之間的通信規(guī)則。 可靠性: AMQP 提供可靠的消息傳遞機(jī)制,確保消息在傳輸過(guò)程中不會(huì)丟失。它通過(guò)持久化消息、確認(rèn)機(jī)制和事務(wù)支持等特性來(lái)保證消息的可靠性。 靈活的路由: AMQP 提供了靈活的消息路由機(jī)制。通過(guò)交換機(jī)和綁定的組合,可以將消息從生產(chǎn)者路由到一個(gè)或多個(gè)隊(duì)列,以滿足不同的消息傳遞需求。支持的交換機(jī)類型包括直連交換機(jī)、主題交換機(jī)、扇形交換機(jī)等。 消息持久化: AMQP 允許消息進(jìn)行持久化,即使在代理或系統(tǒng)故障后也能保留消息。這對(duì)于對(duì)消息傳遞的可靠性和持久性有重要意義。 多種編程語(yǔ)言支持: AMQP 是一種協(xié)議,可以在多種編程語(yǔ)言中實(shí)現(xiàn)和使用。因此,您可以使用不同的編程語(yǔ)言來(lái)開(kāi)發(fā)生產(chǎn)者和消費(fèi)者,以便在不同的應(yīng)用程序之間進(jìn)行消息傳遞。 跨平臺(tái)和云集成: AMQP 可以在不同的操作系統(tǒng)和云平臺(tái)上運(yùn)行。這使得它成為構(gòu)建分布式系統(tǒng)、微服務(wù)架構(gòu)和云集成的理想選擇。 消息過(guò)期時(shí)間: 默認(rèn)情況消息是無(wú)限期存儲(chǔ)在Rabbitmq上面的,但是我們可以設(shè)置過(guò)期時(shí)間,到期后無(wú)論消息有沒(méi)有被接受都會(huì)刪除。
總的來(lái)說(shuō),AMQP 提供了一個(gè)通用的、可靠的消息傳遞協(xié)議,可以促進(jìn)不同應(yīng)用程序或服務(wù)之間的協(xié)作和通信。它的設(shè)計(jì)目標(biāo)是支持高性能、可擴(kuò)展性和可靠性,并且在各種應(yīng)用場(chǎng)景下得到廣泛應(yīng)用,包括金融服務(wù)、電子商務(wù)、物聯(lián)網(wǎng)等。
ACK應(yīng)答:
消費(fèi)者接受消息時(shí),必須返回一個(gè)Ack應(yīng)答,Rabbitmq才會(huì)認(rèn)為這條消息接收成功。如果想刪除這條消息,消費(fèi)者發(fā)送Ack應(yīng)答的時(shí)候,附帶一個(gè)deliveryTag標(biāo)志位就可以了
三種交換機(jī):
直連交換機(jī)(Direct Exchange): 直連交換機(jī)是最簡(jiǎn)單的交換機(jī)類型之一。它根據(jù)消息的路由鍵(Routing Key)將消息路由到與之完全匹配的隊(duì)列。當(dāng)一個(gè)隊(duì)列綁定到直連交換機(jī)時(shí),需要指定一個(gè)綁定鍵(Binding Key),當(dāng)消息的路由鍵與綁定鍵完全匹配時(shí),消息會(huì)被路由到該隊(duì)列。
主題交換機(jī)(Topic Exchange): 主題交換機(jī)根據(jù)消息的路由鍵與主題模式(Topic Pattern)進(jìn)行匹配,并將消息路由到匹配的隊(duì)列。主題模式可以使用通配符進(jìn)行靈活匹配,如使用“*”表示匹配一個(gè)單詞,“#”表示匹配零個(gè)或多個(gè)單詞。這使得主題交換機(jī)能夠支持更靈活的消息路由。
扇形交換機(jī)(Fanout Exchange): 扇形交換機(jī)將消息廣播到所有綁定到它的隊(duì)列,而不考慮消息的路由鍵。當(dāng)一個(gè)隊(duì)列綁定到扇形交換機(jī)時(shí),所有發(fā)送到該交換機(jī)的消息都會(huì)被復(fù)制并發(fā)送到該隊(duì)列。扇形交換機(jī)通常用于實(shí)現(xiàn)消息的廣播機(jī)制,將消息發(fā)送給所有訂閱者。
這些交換機(jī)類型提供了不同的路由策略,適用于不同的消息傳遞需求。根據(jù)具體的業(yè)務(wù)場(chǎng)景和消息的路由規(guī)則,您可以選擇合適的交換機(jī)類型來(lái)實(shí)現(xiàn)消息的靈活路由和分發(fā)。
核心概念:
RabbitMQ 是一個(gè)開(kāi)源的消息代理軟件,它提供了一個(gè)消息傳遞系統(tǒng),用于在不同的應(yīng)用程序或服務(wù)之間交換數(shù)據(jù)。它基于高級(jí)消息隊(duì)列協(xié)議(AMQP)構(gòu)建,旨在高效處理大量的消息。 RabbitMQ 的核心概念包括以下幾個(gè)方面:
消息代理: RabbitMQ 充當(dāng)生產(chǎn)者(發(fā)送者)和消費(fèi)者(接收者)之間的中間人。它接收來(lái)自生產(chǎn)者的消息,并根據(jù)定義的規(guī)則將它們路由到相應(yīng)的消費(fèi)者。 消息: 消息是 RabbitMQ 中的基本單元。它包含要傳遞的數(shù)據(jù)以及與該消息相關(guān)的元數(shù)據(jù)。消息可以是任何形式的數(shù)據(jù),例如文本、JSON、XML 等。 隊(duì)列: 隊(duì)列是 RabbitMQ 用于存儲(chǔ)消息的容器。當(dāng)生產(chǎn)者發(fā)送消息時(shí),消息首先進(jìn)入隊(duì)列,然后等待被消費(fèi)者處理。隊(duì)列遵循先進(jìn)先出(FIFO)的原則,即最先進(jìn)入隊(duì)列的消息首先被消費(fèi)。 交換機(jī): 交換機(jī)是消息的分發(fā)中心,它接收來(lái)自生產(chǎn)者的消息并根據(jù)預(yù)定義的規(guī)則將其路由到一個(gè)或多個(gè)隊(duì)列中。交換機(jī)的類型決定了消息的路由方式,常見(jiàn)的類型有直連交換機(jī)、主題交換機(jī)、扇形交換機(jī)等。 綁定: 綁定是交換機(jī)和隊(duì)列之間的關(guān)聯(lián)關(guān)系。它定義了消息在哪些隊(duì)列上進(jìn)行分發(fā)。一個(gè)隊(duì)列可以綁定到一個(gè)或多個(gè)交換機(jī)上,一個(gè)交換機(jī)也可以綁定到一個(gè)或多個(gè)隊(duì)列上。 消費(fèi)者: 消費(fèi)者是從隊(duì)列中接收并處理消息的應(yīng)用程序或服務(wù)。它訂閱一個(gè)或多個(gè)隊(duì)列,并等待消息的到達(dá)。一旦有消息可用,消費(fèi)者就會(huì)處理它,并確認(rèn)消息已經(jīng)被消費(fèi)。
通過(guò)使用 RabbitMQ,您可以實(shí)現(xiàn)不同應(yīng)用程序或服務(wù)之間的松耦合通信。生產(chǎn)者可以將消息發(fā)送到 RabbitMQ,而不必關(guān)心哪個(gè)具體的應(yīng)用程序或服務(wù)會(huì)接收這些消息。消費(fèi)者可以獨(dú)立于生產(chǎn)者工作,并根據(jù)自己的需求從隊(duì)列中接收消息。 同時(shí),RabbitMQ 還提供了一些高級(jí)功能,如消息持久化、消息確認(rèn)機(jī)制、消息優(yōu)先級(jí)等,以及可擴(kuò)展性和靈活的路由配置,使您能夠構(gòu)建強(qiáng)大而可靠的消息傳遞系統(tǒng)。
工作原理:
Broker:簡(jiǎn)單來(lái)說(shuō)就是消息隊(duì)列服務(wù)器實(shí)體。 Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列。 Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列。 Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來(lái)。 Routing Key:路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞。 vhost:虛擬主機(jī),一個(gè)broker里可以開(kāi)設(shè)多個(gè)vhost,用作不同用戶的權(quán)限分離。 producer:消息生產(chǎn)者,就是投遞消息的程序。 consumer:消息消費(fèi)者,就是接受消息的程序。 channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)。 生產(chǎn)者發(fā)送消息流程:
生產(chǎn)者與Broker建立TCP連接生產(chǎn)者與Broker建立通道生產(chǎn)者通過(guò)通道消息發(fā)送給Broker,由Exchange將消息進(jìn)行轉(zhuǎn)發(fā)Exchange將消息轉(zhuǎn)發(fā)到指定的Queue 消費(fèi)者接收消息里流程:消費(fèi)者與Broker建立TCP連接消費(fèi)者與Broker建立通道消費(fèi)者監(jiān)聽(tīng)指定的Queue(隊(duì)列)當(dāng)有消息到達(dá)Queue時(shí)Broker默認(rèn)將消息推送給消費(fèi)者消費(fèi)者接收到消息ack回復(fù)
同步接收和異步接收
異步:
異步消耗系統(tǒng)的資源較少,但是小程序和后端之間并不是長(zhǎng)連接,所以后端項(xiàng)目異步方式接收到隊(duì)列中的消息無(wú)法推送給移動(dòng)端的小程序。小程序自帶的消息推送機(jī)制,但是這個(gè)功能是有嚴(yán)格限制的,有效期和推送次數(shù)做了限制。
同步:
可以通過(guò)java后端項(xiàng)目采用同步的方式接收隊(duì)列中的消息。在移動(dòng)端,我們創(chuàng)建定時(shí)器,然后向后端java項(xiàng)目發(fā)出輪詢請(qǐng)求。后端java項(xiàng)目接收到輪詢請(qǐng)求后,用同步的方式接收消息隊(duì)列中的消息,然后把消息隊(duì)列存儲(chǔ)在MongoDB上面,最后向小程序返回接收了多少條新消息,移動(dòng)端則彈出提示框告知用戶消息的消息通知
三.五種消息模型:
簡(jiǎn)單模式
一個(gè)生產(chǎn)者只能對(duì)應(yīng)一個(gè)消費(fèi)者,中間用隊(duì)列連接
work工作模式
多個(gè)消費(fèi)者去消費(fèi)隊(duì)列里的消息,但是隊(duì)列里的消息只能被一個(gè)消費(fèi)者消費(fèi),多部署幾個(gè)消費(fèi)者,就可以緩解壓力。
發(fā)布/訂閱(pub/sub)模式
假如我們有一個(gè)國(guó)家氣象局天氣預(yù)報(bào)系統(tǒng),這個(gè)時(shí)候他發(fā)送消息,其他的服務(wù)商,比如百度、網(wǎng)易、騰訊等公司都要從國(guó)家天氣預(yù)報(bào)系統(tǒng)那里獲取天氣怎么辦呢?總不能百度獲取了今天的天氣其他公司就獲取不了天氣了吧,或者讓國(guó)家天氣預(yù)報(bào)系統(tǒng)給每個(gè)服務(wù)商都發(fā)送一次消息,那樣顯然是很麻煩的。 所以我們需要用到一個(gè)Exchange交換機(jī)角色來(lái)幫助我們把消息發(fā)給所有訂閱我們的服務(wù)商。
Routing路由模式
路由模式不是給所有訂閱他的隊(duì)列發(fā)消息,而是根據(jù)路由鍵來(lái)確定給那個(gè)隊(duì)列發(fā)消息,隊(duì)列和交換機(jī)綁定時(shí)通過(guò)路由鍵,而生產(chǎn)者發(fā)消息時(shí)也需要指定路由鍵,這樣就確定給那個(gè)隊(duì)列發(fā)消息了。
Topics通用模式
生產(chǎn)者將消息發(fā)送到Topic交換機(jī),交換機(jī)按照復(fù)雜的給咱,把消息路由到某個(gè)隊(duì)列中
柚子快報(bào)邀請(qǐng)碼778899分享:分布式 RabbitMQ詳情
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。