首頁技術(shù)文章正文

RabbitMQ詳細(xì)教程【黑馬程序員】

更新時(shí)間:2020-07-09 來源:黑馬程序員 瀏覽量:


1、MQ簡介

消息中間件利用高效可靠的消息傳遞機(jī)制進(jìn)行平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來 進(jìn)行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊(duì)模型,它可以在分布式環(huán)境下擴(kuò)展進(jìn) 程間的通信。對于消息中間件,常見角色大致也就有 Producer(生產(chǎn)者)、Consumer(消 費(fèi)者)。

常見的消息中間件產(chǎn)品:

1)ActiveMQ

ActiveMQ是Apache出品,最流行的,能力強(qiáng)勁的開源消息總線。ActiveMQ 是 一個(gè)完全支持 JMS1.1和J2EE 1.4 規(guī)范的JMS Provider 實(shí)現(xiàn)。我們在本次課程中 介紹 ActiveMQ 的使用。

2)RabbitMQ

AMQP協(xié)議的領(lǐng)導(dǎo)實(shí)現(xiàn),支持多種場景。淘寶的 MySQL 集群內(nèi)部有使用它進(jìn)行通訊, OpenStack 開源云平臺(tái)的通信組件,最先在金融行業(yè)得到運(yùn)用。

3)ZeroMQ 史上最快的消息隊(duì)列系統(tǒng)

4)Kafka Apache 下的一個(gè)子項(xiàng)目

特點(diǎn):高吞吐,在一臺(tái)普通的服務(wù)器上既可以達(dá)到 10W/s 的吞吐速率;完全的分布式系統(tǒng)。適合處理海量數(shù)據(jù)。

2 MQ 作用

1)解耦 :中間件中的生產(chǎn)者只管發(fā)送消息 , 消費(fèi)者只要從隊(duì)列當(dāng)中獲取消息進(jìn)行消費(fèi) 就可以 , 從而來實(shí)現(xiàn)業(yè)務(wù)的解耦 。

2)冗余存儲(chǔ) : 有些情況下,處理數(shù)據(jù)的過程會(huì)失敗。消息中間件可以把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)。在把一個(gè)消息從消息中間 件中刪 除之前,需要你的處理系統(tǒng)明確地指出該消息己經(jīng)被處理完成,從而確保你的數(shù)據(jù) 被安全地保 存直到你使用完畢。

3)可恢復(fù)性: 當(dāng)系統(tǒng)一部分組件失效時(shí),不會(huì)影響到整個(gè)系統(tǒng) 。 消息中間件降低了進(jìn)程間的 稿合度,所以即使一個(gè)處理消息的進(jìn)程掛掉,加入消息中間件中的消息仍然可以在系 統(tǒng)恢復(fù)后 進(jìn)行處理 。

4)順序保證: 在大多數(shù)使用場景下,數(shù)據(jù)處理的順序很重要,大部分消息中間件支持一 定程 度上的順序性。

5)緩沖: 在任何重要的系統(tǒng)中,都會(huì)存在需要不同處理時(shí)間的元素。消息中間件通過一 個(gè)緩 沖層來幫助任務(wù)最高效率地執(zhí)行,寫入消息中間件的處理會(huì)盡可能快速 。

6)異步通信: 在很多時(shí)候應(yīng)用不想也不需要立即處理消息 。 消息中間件提供了異步處 理機(jī)制,允許應(yīng)用把一些消息放入消息中間件中,但并不立即處理它,在之后需要的時(shí)候再 慢慢處理 。

3、RabbitMQ 安裝及啟動(dòng)

3.1 安裝依賴環(huán)境

rpm -ivh erlang-20.3.8.6-1.el6.x86_64.rpm

yum -y install epel-release

yum -y install socat

3.2 安裝 rabbitMQ

rpm -ivh rabbitmq-server-3.7.7-1.el6.noarch.rpm

3.4  RabbitMQ 啟動(dòng)/停止

啟動(dòng) : service rabbitmq-server start

停止: service rabbitmq-server stop

查看狀態(tài): service rabbitmq-server status

4、Rabbit MQ 管理界面訪問

4.1 Overview 概要

該欄目主要展示的是MQ的概要信息 , 如消息的數(shù)量, Connection , Channel, Exchange , Queue , Consumer的數(shù)量。

1594261543318_Rabbit-MQ-01.jpg


4.2 Exchange 交換器

該欄目主要展示的是當(dāng)前虛擬主機(jī)下的交換器,也可以在此添加一個(gè)新的交換器, 并且配 置對應(yīng)的交換器的規(guī)則屬性 。


1594261653052_Rabbit-MQ-02.jpg


4.3 Queues 隊(duì)列

該欄目展示的是消息隊(duì)列的信息,里面有各個(gè)隊(duì)列的概要信息,也可以在此欄目添加隊(duì)列Queue。

1594261663033_Rabbit-MQ-03.jpg


4.4 Admin系統(tǒng)管理

該欄目展示的是用戶管理的信息, 包含用戶列表的展示,添加用戶,添加虛擬主機(jī)等信息。

1594261672108_Rabbit-MQ-04.jpg


5、RabbitMQ的相關(guān)概念

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

5.1.1 生產(chǎn)者

Producer: 生產(chǎn)者,就是投遞消息的一方。

生產(chǎn)者創(chuàng)建消息,然后發(fā)布到 RabbitMQ 中。消息一般可以包含 2 個(gè)部分:消息體和標(biāo)簽 (Label)。消息體也可以稱之為 payload,在實(shí)際應(yīng)用中,消 息體一般是一個(gè)帶有業(yè)務(wù)邏輯結(jié)構(gòu)的數(shù)據(jù),比如一個(gè)JSON 字符串。當(dāng)然可以進(jìn)一步對這個(gè)消息體進(jìn)行序列化操作。消息的標(biāo)簽用來表述這條消息,比如 一個(gè)交換器的名稱和一個(gè)路由鍵 。生產(chǎn)者把消息交由 RabbitMQ,RabbitMQ之后會(huì)根據(jù)標(biāo)簽把消息發(fā)送給感興趣的消費(fèi)者 (Consumer ) 。

5.1.2 消費(fèi)者

Consumer:消費(fèi)者,就是接收消息的一方。
消費(fèi)者連接到RabbitMQ服務(wù)器,并訂閱到隊(duì)列上 。當(dāng)消費(fèi)者消費(fèi)一 條消息時(shí),只 是消費(fèi)消息的消息體(payload )。在消息路由的過程中,消息的標(biāo)簽會(huì)丟棄,存入到隊(duì) 列中的消息只有消息體,消費(fèi)者也只會(huì)消費(fèi)到消息體,也就不知道消息的生產(chǎn)者是誰,當(dāng)然消費(fèi)者也不需要知道 。


5.2 隊(duì)列
Queue:隊(duì)列,是RabbitMQ的內(nèi)部對象,用于存儲(chǔ)消息。

1594261680542_Rabbit-MQ-05.jpg


5.3 交換器,路由鍵,綁定

5.3.1 交換器

Exchange: 交換器。在上圖中我們暫時(shí)可以理解成生產(chǎn)者將消息投遞到隊(duì)列中,實(shí)際上這個(gè)在RabbitMQ中不會(huì)發(fā)生。真實(shí)情況是,生產(chǎn)者將消息發(fā)送到 Exchange (交換 器),由交換器將消息路由到一個(gè)或者多個(gè)隊(duì)列中。如果路由不到,或 許會(huì)返回給生產(chǎn)者, 或許直接丟棄。這里可以將 RabbitMQ中的交換器看作一個(gè)簡單的實(shí)體。

1594261690601_Rabbit-MQ-06.jpg


RabbitMQ中的交換器有四種類型,四種類型分別是 fanout、direct、topic 、 headers,不同的類型有著不同的路由策略。

5.3.2 路由鍵

RoutingKey : 路由鍵 。生產(chǎn)者將消息發(fā)給交換器 的時(shí)候,一般會(huì)指定一個(gè)RoutingKey,用 來指定這個(gè)消息的路由規(guī)則,而這個(gè)RoutingKey需要與交換器類型和綁定鍵 (BindingKey) 聯(lián)合使用才能最終生效。

在交換器類型和綁定鍵 (BindingKey) 固定的情況下,生產(chǎn)者可以在發(fā)送消息給交換器時(shí),通過指定RoutingKey來決定消息流向哪里。

5.3.3 綁定

Binding:綁定。RabbitMQ 中通過綁定將交換器與隊(duì)列關(guān)聯(lián)起來,在綁定的時(shí)候一 般會(huì)指定一個(gè)綁定鍵(BindingKey) ,這樣RabbitMQ就知道如何正確地將消息路由到隊(duì)列了。

5.4 交換器類型

1)fanout: 它會(huì)把所有發(fā)送到該交換器的消息路由到所有與該交換器綁定的隊(duì)列 中。

2)direct: 該類型的交換器路由規(guī)則也很簡單,它會(huì)把消息 路由到那些BindingKey和RoutingKey完全匹配的隊(duì)列中。

3)topic: 前面講到direct類型的交換器路由規(guī)則是完全匹配 BindingKey 和RoutingKey,但是這種嚴(yán)格的匹配方式在很多情況下不能滿足實(shí)際業(yè)務(wù)的需求。 topic 類型的交換器在匹配規(guī)則上進(jìn)行了擴(kuò)展,它與direct類型的交換器相似,也是將消息路由到BindingKey 和RoutingKey 相匹配的隊(duì)列中,但這里的匹配規(guī)則有些 不同,它約定:

RoutingKey為一個(gè)點(diǎn)號(hào)"." 分割的字符串,如:com.itcast.client , com.itheima.exam。

BindingKey與RoutingKey一樣也是點(diǎn)號(hào)"." 分割的字符串。 BindingKey中可以存在兩種特殊的字符串"*" 和 "#" , 用于模糊匹配,其中 "#"用于匹配一個(gè)單詞,"*"用于匹配多個(gè)單個(gè)(可以是零個(gè))。

4)headers : 該類型的交換器不依賴于路由鍵的匹配規(guī)則來路由消息,而是根據(jù) 發(fā)送的消息內(nèi)容中的headers屬性進(jìn)行匹配。

6、生產(chǎn)者發(fā)送消息

6.1 隊(duì)列綁定

6.1.1 創(chuàng)建隊(duì)列

在RabbitMQ的后臺(tái)管理界面中創(chuàng)建一個(gè)隊(duì)列,指定隊(duì)列名稱。

1594261700171_Rabbit-MQ-07.jpg


6.1.2 創(chuàng)建交換器Exchange

在RabbitMQ的后臺(tái)管理界面中創(chuàng)建一個(gè)交換器,指定交換器的名稱, 并且指定交換器類型。

1594261708927_Rabbit-MQ-08.jpg


6.1.3 綁定隊(duì)列與交換器

在交換器列表點(diǎn)擊對應(yīng)的交換器 , 進(jìn)入到綁定界面,指定隊(duì)列名稱queue,指定RoutingKey, 通過該RoutingKey來綁定該隊(duì)列與交換器Exchange 。

1594261718401_Rabbit-MQ-09.jpg


之后,在發(fā)送消息時(shí), 指定了Exchange,及 RoutingKey, 就可以將該消息路由到該隊(duì)列queue中。

1594261729522_Rabbit-MQ-10.jpg


6.2 發(fā)送消息邏輯代碼

6.2.1 引入依賴

1594261738256_Rabbit-MQ-10-2.jpg


6.2.2 發(fā)送消息

1594261748181_Rabbit-MQ-10-3.jpg

1594261774358_Rabbit-MQ-10-4.jpg


6.3 發(fā)送消息平臺(tái)監(jiān)測

1594261791437_Rabbit-MQ-11.jpg


7、消費(fèi)者接受消息 7.1 引入依賴

1594261811106_Rabbit-MQ-11-1.jpg

7.2 接收消息

1594261868515_Rabbit-MQ-11-2.jpg

1594261881532_Rabbit-MQ-11-3.jpg

1594261893768_Rabbit-MQ-11-4.jpg


7.3 結(jié)果輸出

1594261913478_Rabbit-MQ-12.jpg

其中:

consumerTag : 消息消費(fèi)者的標(biāo)簽

properties : 消息內(nèi)容的頭信息數(shù)據(jù)

envelope : 消息體的數(shù)據(jù)包,其中包含消息發(fā)送時(shí)指定的exchange,routingKey等信息。

猜你喜歡:
什么是枚舉?如何使用枚舉?
黑馬程序員JavaSE基礎(chǔ)加強(qiáng)階段課程發(fā)布【內(nèi)含下載鏈接】
Java冒泡排序算法詳細(xì)介紹【2020最新】
Java中級(jí)程序員課程

分享到:
在線咨詢 我要報(bào)名
和我們在線交談!