RabbitMQ實(shí)戰(zhàn):理解消息通信-創(chuàng)新互聯(lián)

本系列是「RabbitMQ實(shí)戰(zhàn):高效部署分布式消息隊(duì)列」書籍的總結(jié)筆記。

站在用戶的角度思考問題,與客戶深入溝通,找到宣威網(wǎng)站設(shè)計(jì)與宣威網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋宣威地區(qū)。

前段時(shí)間總結(jié)完了「深入淺出MyBatis」系列,對(duì)MyBatis有了更全面和深入的了解,在掘金社區(qū)也收到了一些博友的喜歡,很高興。另外,短暫的陪產(chǎn)假就要結(jié)束了,小寶也二周了,下周二就要投入工作了,希望自己盡快調(diào)整過來,加油努力。

從本篇開始總結(jié)「RabbitMQ實(shí)戰(zhàn)」系列的閱讀筆記,RabbitMQ是一個(gè)開源的消息代理和隊(duì)列服務(wù)器,可以通過基本協(xié)議在完全不同的應(yīng)用之間共享數(shù)據(jù),可以將作業(yè)排隊(duì)以便讓分布式服務(wù)進(jìn)行處理。

本篇介紹下消息通信,首先介紹基礎(chǔ)概念,將這些概念映射到AMQP協(xié)議,然后介紹消息持久化、發(fā)送方確認(rèn)模式等消息可靠性保證。

通過本篇介紹,你會(huì)了解到:

  • 消息通信概念:消費(fèi)者、生產(chǎn)者和代理
  • AMQP元素:隊(duì)列、交換器、綁定
  • 虛擬主機(jī)
  • 消息持久化
  • 發(fā)送方確認(rèn)模式
消息通信概念

此部分的介紹,會(huì)牽涉到AMQP的元素,如果之前沒接觸過的,可以結(jié)合下面的「AMQP元素」進(jìn)行理解。

消息

消息是傳輸?shù)闹黧w,消息包括兩部分:有效載荷(payload)和標(biāo)簽(label);有效載荷是要傳輸?shù)臄?shù)據(jù),可以是任何內(nèi)容,比如JSON串、二進(jìn)制、自定義的數(shù)據(jù)協(xié)議等;標(biāo)簽描述了有效載荷,并且Rabbit用它來決定誰將獲得消息的投遞。

可以與HTTP協(xié)議類比,HTTP消息頭部描述了消息體的類型、大小等,HTTP消息體是要傳輸?shù)臄?shù)據(jù),HTTP服務(wù)端通過消息頭部決定如何處理請(qǐng)求和數(shù)據(jù)。

生產(chǎn)者和消費(fèi)者

生產(chǎn)者創(chuàng)建消息,然后發(fā)送到代理服務(wù)器(RabbitMQ Server),AMQP只會(huì)用標(biāo)簽表述這條消息(一個(gè)交換器名稱和可選的主題標(biāo)記),Rabbit服務(wù)器會(huì)根據(jù)標(biāo)簽把消息發(fā)送給訂閱的消費(fèi)者。

消費(fèi)者消費(fèi)消息,它會(huì)訂閱到隊(duì)列(queue)上,每當(dāng)有消息到達(dá)RabbitMQ服務(wù)器時(shí),會(huì)發(fā)送給消費(fèi)者,消費(fèi)者收到消息時(shí),會(huì)進(jìn)行處理。

注意:消費(fèi)者收到的消息只包括有效載荷,所有不會(huì)知道是從哪里發(fā)來的。

連接和信道

要想發(fā)布或消費(fèi)消息,必須先與RabbitMQ Server建立一條TCP連接,建立TCP連接之后,要?jiǎng)?chuàng)建一條信道,信道是建立在真實(shí)TCP連接的虛擬連接。

AMQP命令都是通過信道發(fā)送出去的,每條信道會(huì)被指派一個(gè)唯一的ID,為什么不直接通過TCP連接發(fā)送AMQP命令呢? 因?yàn)椴僮飨到y(tǒng)建立和銷毀TCP會(huì)話是很昂貴的,而且創(chuàng)建的連接數(shù)也有限。 通過引入通道,可以在連接上建立通道,而且通道是私密的,相互不受影響。

通道的概念還是有點(diǎn)抽象,后面專門寫一篇文章進(jìn)行分析介紹,這里簡單理解下吧。

AMQP元素

AMQP消息路由有三部分組成:隊(duì)列、交換器和綁定,隊(duì)列是存放消息的地方,交換器是決定不同的分發(fā)策略,綁定是隊(duì)列和交換器的橋梁,定義匹配規(guī)則。

生產(chǎn)者發(fā)送消息到交換器,交換器根據(jù)自身類型和綁定規(guī)則,將消息存放在對(duì)應(yīng)隊(duì)列中,然后將消息發(fā)送到監(jiān)聽隊(duì)列的消費(fèi)者。

RabbitMQ實(shí)戰(zhàn):理解消息通信

如上圖:P為生產(chǎn)者,X為交換器,交換器類型為direct,根據(jù)不同的綁定規(guī)則(orange、black、green),分發(fā)給不同的隊(duì)列,C為消費(fèi)者,從不同的隊(duì)列介紹消息。

隊(duì)列

消費(fèi)者通過兩種方式從特定的隊(duì)列接收消息:

  • basic.consume,這樣會(huì)將信道置為接收模式,直到取消對(duì)隊(duì)列的訂閱;
  • basic.get,主動(dòng)讓消費(fèi)者接收隊(duì)列中的下一條消息;

basic.get會(huì)影響性能,推薦使用basic.consume來實(shí)現(xiàn)高吞吐量,因?yàn)槠涮幚磉^程是先訂閱消息,獲取單條消息,再取取消訂閱。

如果隊(duì)列擁有多個(gè)消費(fèi)者時(shí),隊(duì)列收到的消息將以循環(huán)的方式發(fā)給消費(fèi)者,即多個(gè)消費(fèi)者平均消費(fèi)這些消息。

另外,消費(fèi)者接收到的每一條消息都要進(jìn)行確認(rèn),必須通過basic.ack命令向rabbitmq服務(wù)端發(fā)送一個(gè)確認(rèn)。 也可以設(shè)置auto_ack為true,只要消費(fèi)者接收到消息,就自動(dòng)視為確認(rèn),不過不建議這樣,因?yàn)榻邮盏讲淮順I(yè)務(wù)邏輯處理成功。 服務(wù)端接收到確認(rèn)后,會(huì)從隊(duì)列中刪除對(duì)應(yīng)消息。

還有一種場景,在接收到消息后,如果不想處理,可以通過下面方式處理:

  • 把消費(fèi)者從RabbitMQ服務(wù)器斷開連接,,這樣RabbitMQ會(huì)自動(dòng)將消息入隊(duì)并發(fā)送給另外一個(gè)消費(fèi)者;
  • 如果不想發(fā)送給其他消費(fèi)者處理,就是想忽略這個(gè)消息,可以發(fā)送basic.reject命令;

最后來介紹下如何創(chuàng)建隊(duì)列,首先明確下是生成者還是消費(fèi)者創(chuàng)建,關(guān)鍵點(diǎn)是:生產(chǎn)者能否承擔(dān)起丟失消息,因?yàn)榘l(fā)出去的消息如果路由到了不存在的隊(duì)列,Rabbit會(huì)忽略它們。所以,建議生成者和消費(fèi)者都嘗試去創(chuàng)建隊(duì)列,可以通過設(shè)置queue.declare的passive選項(xiàng)設(shè)置為ture來判斷隊(duì)列是否存在,如果不存在會(huì)返回一個(gè)錯(cuò)誤。

通過queue.declare命令來創(chuàng)建隊(duì)列,有一些選項(xiàng)說明下:

  • exclusive:如果設(shè)置true的化,隊(duì)列將變成私有的,只有創(chuàng)建隊(duì)列的應(yīng)用程序才能夠消費(fèi)隊(duì)列消息;
  • auto-delete:當(dāng)最后一個(gè)消費(fèi)者取消訂閱的時(shí)候,隊(duì)列會(huì)自動(dòng)移除;
  • durable:是否要持久化;
queueDeclare(String queue, 
            boolean durable, 
            boolean exclusive, 
            Map<String, Object> arguments);
交換器和綁定

交換器有四種類型:direct、fanout、topic、headers,其中headers匹配消息的header而非路由鍵,不太實(shí)用,就不詳細(xì)介紹了。

第一種:direct交換器

direct交換器比較簡單,如果和路由鍵 完全匹配 的話,就會(huì)投遞到對(duì)應(yīng)的隊(duì)列:

channel.exchangeDeclare(EXCHANGE_NAME, "direct");
channel.queueBind(queueName, EXCHANGE_NAME, routingKey);

服務(wù)器默認(rèn)包含一個(gè)空白字符串名稱的默認(rèn)路由器,當(dāng)聲明一個(gè)隊(duì)列時(shí),會(huì)自定綁定到默認(rèn)交換器,并以隊(duì)列名稱作為路由鍵。

第二種:fanout交換器

fanout交換器,不處理路由鍵,只需要簡單的將隊(duì)列綁定到交換機(jī)上,為會(huì)每個(gè)消費(fèi)者自動(dòng)生成一個(gè)隨機(jī)隊(duì)列,所有的消費(fèi)者都會(huì)收到所有消息。

RabbitMQ實(shí)戰(zhàn):理解消息通信

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

第三種:topic交換器

topic交換器,將路由鍵和某模式進(jìn)行匹配,此時(shí)隊(duì)列需要綁定要一個(gè)模式上。

RabbitMQ實(shí)戰(zhàn):理解消息通信

channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.queueBind(queueName, EXCHANGE_NAME, "*.orange.*");

關(guān)于模式,符號(hào)#匹配一個(gè)或多個(gè)詞,符號(hào)匹配一個(gè)詞,因此kfs.#能夠匹配到kfs.session.message,但是audit.只會(huì)匹配到audit.session。

虛擬主機(jī)

每個(gè)RabbitMQ服務(wù)器都能創(chuàng)建虛擬消息服務(wù)器,稱為虛擬主機(jī)(vhost),每個(gè)RabbitMQ本質(zhì)上是一個(gè)mini版的RabbitMQ服務(wù)器,擁有自己的隊(duì)列、交換器、綁定,還有自己的權(quán)限機(jī)制。

連接時(shí),必須制定vhost,rabbitmq包含了默認(rèn)的vhost:"/"。當(dāng)創(chuàng)建一個(gè)用戶時(shí),會(huì)被指派給至少一個(gè)vhsot,并且相互隔離。

vhost不能通過AMQP協(xié)議創(chuàng)建,需要使用rabbitmqctl工具創(chuàng)建。

消息持久化和發(fā)送方確認(rèn)模式

如果沒有持久化,重啟rabbitmq后,隊(duì)列、交換器都會(huì)消失,RabbitMQ提供了持久化的功能,需要滿足以下三個(gè)條件:

  • 交換器設(shè)置為持久化,通過durable屬性;
  • 隊(duì)列設(shè)置為持久化,通過durable屬性;
  • 消息投遞模式delivery設(shè)置為2;

當(dāng)發(fā)布一條持久化消息到持久化交換器上時(shí),rabbit會(huì)在消息提交到日志文件后才會(huì)發(fā)送響應(yīng),所有會(huì)損失性能,所以,只對(duì)重要數(shù)據(jù)持久化即可。

考慮這種情況:由于發(fā)布消息后,不返回任何信息給生產(chǎn)者,如何只對(duì)服務(wù)器已經(jīng)持久化到硬盤了呢,可能在傳輸過程中丟失,或者持久化前服務(wù)器宕機(jī),導(dǎo)致消息丟失。

RabbitMQ通過「發(fā)送方確認(rèn)模式」來解決上面的問題。首先,需要將信道設(shè)置成confirm模式,這樣所有在信道上發(fā)布的消息都會(huì)被指派一個(gè)唯一的ID號(hào),一旦消息被投遞到所有匹配的隊(duì)列或持久化到磁盤,會(huì)發(fā)送一個(gè)確認(rèn)消息給生產(chǎn)者。

通過本篇的介紹,對(duì)Rabbit的消息模型有了整體了解,下一篇會(huì)寫個(gè)DEMO,并介紹下運(yùn)行和管理RabbitMQ。

歡迎掃描下方二維碼,關(guān)注我的個(gè)人微信公眾號(hào) ~

RabbitMQ實(shí)戰(zhàn):理解消息通信

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁名稱:RabbitMQ實(shí)戰(zhàn):理解消息通信-創(chuàng)新互聯(lián)
瀏覽路徑:http://muchs.cn/article22/dpjccc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、企業(yè)建站、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站營銷、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作