微吼云上線多路互動(dòng)直播服務(wù) 加速多場(chǎng)景互動(dòng)直播落地
741
2025-03-31
1、RabbitMQ是什么?
RabbitMQ是一個(gè)消息中間件:它接受并轉(zhuǎn)發(fā)消息。你可以把它當(dāng)做一個(gè)快遞站點(diǎn),當(dāng)你要發(fā)送一個(gè)包裹時(shí),你把你的包裹放到快遞站,快遞員最終會(huì)把你的快遞送到收件人那里,按照這種邏輯RabbitMQ是一個(gè)快遞站,一個(gè)快遞員幫你傳遞快件。RabbitMQ與快遞站的主要區(qū)別在于,它不處理快件而是接收,存儲(chǔ)和轉(zhuǎn)發(fā)消息數(shù)據(jù)。
2、RabbitMQ四大核心概念
生產(chǎn)者: 產(chǎn)生數(shù)據(jù)發(fā)送消息的程序是生產(chǎn)者。
交換機(jī): 交換機(jī)是RabbitMQ非常重要的一個(gè)部件,一方面它接收來(lái)自生產(chǎn)者的消息,另一方面它將消息推送到隊(duì)列中。交換機(jī)必須確切知道如何處理它接收到的消息,是將這些消息推送到特定隊(duì)列還是推送到多個(gè)隊(duì)列,亦或者是把消息丟棄,這個(gè)得有交換機(jī)類(lèi)型決定。
隊(duì)列: 隊(duì)列是RabbitMQ內(nèi)部使用的一種數(shù)據(jù)結(jié)構(gòu),盡管消息流經(jīng)RabbitMQ和應(yīng)用程序,但它們只能存儲(chǔ)在隊(duì)列中。隊(duì)列僅受主機(jī)的內(nèi)存和磁盤(pán)限制的約束,本質(zhì)上是一個(gè)大的消息緩沖區(qū)。許多生產(chǎn)者可以將消息發(fā)送到一個(gè)隊(duì)列,許多消費(fèi)者可以嘗試從一個(gè)隊(duì)列接收數(shù)據(jù)。這就是我們使用隊(duì)列的方式。
消費(fèi)者: 消費(fèi)與接收具有相似的含義。消費(fèi)者大多時(shí)候是一個(gè)等待接收消息的程序。請(qǐng)注意生產(chǎn)者,消費(fèi)者和消息中間件很多時(shí)候并不在同一機(jī)器上。同一個(gè)應(yīng)用程序既可以是生產(chǎn)者又是可以是消費(fèi)者。
3、RabbitMQ核心-7種模式
3.1、簡(jiǎn)單模式
只有一個(gè)生產(chǎn)者,一個(gè)消費(fèi)者;
3.2、工作隊(duì)列模式(Work queues)
一個(gè)生產(chǎn)者,多個(gè)消費(fèi)者,每個(gè)消費(fèi)者獲取到的消息唯一。
3.3、發(fā)布/訂閱模式(Publish/Subscribe)
一個(gè)生產(chǎn)者發(fā)送的消息會(huì)被多個(gè)消費(fèi)者獲取。發(fā)送到Fanout Exchange的消息都會(huì)被轉(zhuǎn)發(fā)到與該Exchange綁定(binding)的所有的Queue上。這種模式不需要任何Routekey,需要提前將Exchange 與Queue進(jìn)行綁定,一個(gè)Exchange可以綁定多個(gè)Queue,一個(gè)Queue可以和多個(gè)Exchange綁定。如果接收到消息的Exchange沒(méi)有與任何Queue綁定,則消息會(huì)丟失。
3.4、路由模式(Routing)
任何發(fā)送到Direct Exchange的消息都會(huì)被轉(zhuǎn)發(fā)到RouteKey指定的Queue,這種模式下不需要將Exchange進(jìn)行任何綁定(binding)操作,消息傳遞時(shí)需要一個(gè)RouteKey,可以簡(jiǎn)單的理解為要發(fā)送到的隊(duì)列名字。如果vhost中不存在該隊(duì)列名,消息會(huì)丟失。
3.5、主題模式(Topic)
任何發(fā)送到Topic Exchange的消息都會(huì)被轉(zhuǎn)發(fā)到所有關(guān)心RouteKey指定主題的Queue中。就是每個(gè)隊(duì)列都有其關(guān)心的主題,所有的消息都帶有一個(gè)標(biāo)題(RouteKey),Exchange會(huì)將消息轉(zhuǎn)發(fā)到所有關(guān)注主題能與RouteKey模糊匹配隊(duì)列。這種模式需要Routekey并且提前綁定Exchange與Queue。在進(jìn)行綁定時(shí)要提供一個(gè)該隊(duì)列對(duì)應(yīng)的主題。‘ # ’表示0個(gè)或若干個(gè)關(guān)鍵字,‘ * ’表示一個(gè)關(guān)鍵字。如果Exchange沒(méi)有發(fā)現(xiàn)能夠與RouteKey匹配的Queue,消息會(huì)丟失。
3.6、RPC模式
客戶端發(fā)起RPC請(qǐng)求時(shí),request請(qǐng)求中會(huì)發(fā)送兩個(gè)參數(shù)replyTo和correlationId(replyTo:同步互斥隊(duì)列,也就是該請(qǐng)求對(duì)應(yīng)的隊(duì)列;correlationId:唯一標(biāo)識(shí)),請(qǐng)求存入rpc隊(duì)列,采用的是有界數(shù)組阻塞隊(duì)列(ArrayBlockingQueue),消息接受端(也就是服務(wù)器端)接受到請(qǐng)求之后,利用replyTo中的攜帶的數(shù)據(jù),處理任務(wù)并返回結(jié)果,返回結(jié)果中攜帶correlationId和具體結(jié)果。
3.7、發(fā)布確認(rèn)模式(Publisher Confirms)
發(fā)布確認(rèn)模式有三種策略:
1、單次確認(rèn),并等待超時(shí)時(shí)間,超時(shí)時(shí)間內(nèi)返回結(jié)果;超時(shí)則拋出異常,該策略實(shí)現(xiàn)簡(jiǎn)單;會(huì)大大降低吞吐量,但是延時(shí)可接受。
2、批量確認(rèn),積累到一定次數(shù)再等待返回,該策略會(huì)很大提升效率和吞吐量;但是出錯(cuò)排查困難。
3、同步處理,新建一個(gè)同步集合,正常返回就從隊(duì)列中remove,該策略是最佳實(shí)踐,有效利用資源,錯(cuò)誤可以控制;但是實(shí)現(xiàn)復(fù)雜,需要正確編碼。
4、RabbitMQ工作原理
5、RabbitMQ中名詞介紹
Broker: 表示消息隊(duì)列服務(wù)器實(shí)體,接收和分發(fā)消息的應(yīng)用,RabbitMQ Server 就是 Message Broker。
Virtual host: 出于多租戶和安全因素設(shè)計(jì)的,把 AMQP 的基本組件劃分到一個(gè)虛擬的分組中,類(lèi)似 于網(wǎng)絡(luò)中的 namespace 概念。當(dāng)多個(gè)不同的用戶使用同一個(gè) RabbitMQ server 提供的服務(wù)時(shí),可以劃分出 多個(gè) vhost,每個(gè)用戶在自己的 vhost 創(chuàng)建 exchange/queue 等。
Connection: publisher/consumer 和 broker 之間的 TCP 連接。
Channel: 如果每一次訪問(wèn) RabbitMQ 都建立一個(gè) Connection,在消息量大的時(shí)候建立 TCP Connection 的開(kāi)銷(xiāo)將是巨大的,效率也較低。Channel 是在 connection 內(nèi)部建立的邏輯連接,如果應(yīng)用程 序支持多線程,通常每個(gè) thread 創(chuàng)建單獨(dú)的 channel 進(jìn)行通訊,AMQP method 包含了 channel id 幫助客 戶端和 message broker 識(shí)別 channel,所以 channel 之間是完全隔離的。Channel 作為輕量級(jí)的 Connection 極大減少了操作系統(tǒng)建立 TCP connection 的開(kāi)銷(xiāo) 。
Exchange: message 到達(dá) broker 的第一站,根據(jù)分發(fā)規(guī)則,匹配查詢(xún)表中的 routing key,分發(fā) 消息到 queue 中去。常用的類(lèi)型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast) 。
Queue: 消息最終被送到這里等待 consumer 取走。
Binding: exchange 和 queue 之間的虛擬連接,binding 中可以包含 routing key,Binding 信息被保 存到 exchange 中的查詢(xún)表中,用于 message 的分發(fā)依據(jù)。
RabbitMQ
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。