1 為什么是你? RabbitMQ
RabbitMQ是一個(gè)開(kāi)源的消息代理和隊(duì)列服務(wù)器,通過(guò)普通協(xié)議在完全不同的應(yīng)用之間共享數(shù)據(jù),使用Erlang語(yǔ)言編寫(xiě),并且基于AMQP協(xié)議.
1.1 大廠們共同的抉擇
- 滴滴昂羡、美團(tuán)胸懈、頭條、去哪兒、藝龍...
1.2 得天獨(dú)厚的強(qiáng)勢(shì)
- 開(kāi)源,性能優(yōu)秀,穩(wěn)定性有保障
- 提供可靠性消息投遞模式(confirm), 返回模式 ( return )
- 與Spring AMQP完美整合,API豐富
- 集群模式豐富,表達(dá)式配置逛薇,HA模式,鏡像隊(duì)列模型
- 保證數(shù)據(jù)不丟失的前提做到高可靠性肋杖、可用性
2 高性能之源
- Erlang語(yǔ)言 最初在于交換機(jī)領(lǐng)域的架構(gòu)模式屏鳍,這樣使得RabbitMQ在Broker之間進(jìn)行數(shù)據(jù)交互的性能是非常優(yōu)秀的
- Erlang的優(yōu)點(diǎn): Erlang有著和原生Socket一樣的延遲
3 AMQP協(xié)議
- AMQP全稱: Advanced Message Queuing Protocol 高級(jí)消息隊(duì)列協(xié)議
- AMQP定義
是具有現(xiàn)代特征的二進(jìn)制協(xié)議伊约。 是一個(gè)提供統(tǒng)一消息服務(wù)的應(yīng)用層標(biāo)準(zhǔn)高級(jí)消息隊(duì)列協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開(kāi)放標(biāo)準(zhǔn)孕蝉,為面向消息的中間件設(shè)計(jì)
4 協(xié)議模型
5 AMQP核心概念
- Server: 又稱Broker, 接受客戶端的連接屡律,實(shí)現(xiàn)AMQP實(shí)體服務(wù)
- Connection: 連接,應(yīng)用程序與Broker的網(wǎng)絡(luò)連接
- Channel:網(wǎng)絡(luò)信道,幾乎所有的操作都在Channel中進(jìn)行降淮,Channel是進(jìn)行消息讀寫(xiě)的通道超埋。客戶端可建立多個(gè)Channel,每個(gè)Channel代表一個(gè)會(huì)話任務(wù)
- Message:消息佳鳖,服務(wù)器和應(yīng)用程序之間傳送的數(shù)據(jù)霍殴,由Properties和Body組成。Properties可以對(duì)消息進(jìn)行修飾系吩, 比如消息的優(yōu)先級(jí)来庭、延遲等高級(jí)特性; Body則就是消息體內(nèi)容
- Virtual host:虛擬地址,用于進(jìn)行邏輯隔離穿挨,最上層的消息路由.一個(gè)Virtual Host里面可以有若干個(gè)Exchange和Queue,同一個(gè)Virtual Host里面不能有相同名稱的Exchange或Queue
- Exchange:交換機(jī)月弛,接收消息肴盏,根據(jù)路由鍵轉(zhuǎn)發(fā)消息到綁定的隊(duì)列
- Binding: Exchange和Queue之間的虛擬連接,binding中可以包含routing key
- Routing key:一個(gè)路由規(guī)則帽衙,虛擬機(jī)可用它來(lái)確定如何路由一個(gè)特定消息
- Queue:也稱為Message Queue,消息隊(duì)列菜皂,保存消息并將它們轉(zhuǎn)發(fā)給消費(fèi)者
6 RabbitMQ整體架構(gòu)與消息流轉(zhuǎn)
7 安裝
7.1 本節(jié)食用指南
- 官網(wǎng)地址: http://www.rabbitmq.com/
- 預(yù)先準(zhǔn)備:安裝Linux必要依賴包
- 下載RabbitMQ必須安裝包
- 配置文件修改
7.2 下載及安裝
7.2.1 Ubuntu環(huán)境
7.2.2 CentOS7.3
對(duì)于初學(xué)者,推薦使用一鍵式的RPM安裝方式
-
注意與 erlang 版本的對(duì)應(yīng)關(guān)系!
由于筆者使用3.6.5 版本.查看對(duì)應(yīng) erlang
-
下載 erlang 環(huán)境
-
下載完畢
-
rpm時(shí)報(bào)錯(cuò),缺少依賴
-
解決問(wèn)題
-
再次 rpm
-
下載 rabbitmq rpm 文件
-
下載完畢
-
安裝報(bào)錯(cuò)
-
下載 socat
-
安裝 socat
-
再次安裝 rebbitmq 即可.
配置文件
-
默認(rèn)端口號(hào)
- 編輯用戶訪問(wèn)權(quán)限.
-
修改如下,暫時(shí)本地可訪問(wèn)
7.2.3 macOS
- 下載安裝RabbitMQ
// 更新brew資源
brew update
// 執(zhí)行安裝
brew install rabbitmq
MQ的安裝目錄在 /usr/local/Cellar/rabbitmq
- 安裝RabiitMQ的可視化監(jiān)控插件
// 切換到MQ目錄,注意你的安裝版本可能不是3.7.15
cd /usr/local/Cellar/rabbitmq/3.7.15/
// 啟用rabbitmq management插件
sudo sbin/rabbitmq-plugins enable rabbitmq_management
- 配置環(huán)境變量
sudo vi /etc/profile
//加入以下兩行
export RABBIT_HOME=/usr/local/Cellar/rabbitmq/3.7.4
export PATH=$PATH:$RABBIT_HOME/sbin
// 立即生效
source /etc/profile
- 后臺(tái)啟動(dòng)rabbitMQ
// 后臺(tái)啟動(dòng)
rabbitmq-server -detached
// 查看狀態(tài)
rabbitmqctl status
// 訪問(wèn)可視化監(jiān)控插件的界面
// 瀏覽器內(nèi)輸入 http://localhost:15672,默認(rèn)的用戶名密碼都是guest,登錄后可以在Admin那一列菜單內(nèi)添加自己的用戶
rabbitmqctl stop 關(guān)閉
8 基本使用
8.1 常用命令
- 啟動(dòng)服務(wù)
rabbitmq-server start &
- 停止服務(wù)
rabbitmqctl stop_ app
- 管理插件
rabbitmq-plugins enable rabbitmq_ management
- 訪問(wèn)地址
http://192.168.11.76:15672/
8.2 重啟操作
9 quickstart - 消息的生產(chǎn)與消費(fèi)
9.1 基本構(gòu)建缺一不可
- ConnectionFactory:獲取連接工廠
- Connection:一個(gè)連接
- Channel:數(shù)據(jù)通信信道,可發(fā)送和接收消息
- Queue:具體的消息存儲(chǔ)隊(duì)列
- Producer & Consumer生產(chǎn)和消費(fèi)者
9.2 實(shí)操演示
-
Pro
-
Con
由于是Con端才創(chuàng)建有對(duì)列,所以必須先啟動(dòng)Con端,再啟動(dòng)Pro端!
分別啟動(dòng)運(yùn)行
10 命令行與管控臺(tái)常規(guī)操作
10.1 常用命令行
- rabbitmqctl stop_ app: 關(guān)閉應(yīng)用
- rabbitmqctl start app: 啟動(dòng)應(yīng)用
- rabbitmqctl status: 節(jié)點(diǎn)狀態(tài)
- rabbitmqctl add_ user username password:添加用戶
- rabbitmqctl list users:列出所有用戶
- rabbitmqctl delete_ user username:刪除用戶
- rabbitmqctl clear permissions -p vhostpath username:清除用戶權(quán)限
- rabbitmqctl list user_ permissions username:列出用戶權(quán)限
- rabbitmqctl change_ password username newpassword:修改密碼
- rabbitmqctl set permissions -p vhostpath username
- ".""."".*": 設(shè)置用戶權(quán)限
- rabbitmqctl add vhost vhostpath:創(chuàng)建虛擬主機(jī)
- rabbitmqctl list vhosts: 列出所有虛擬主機(jī)
- rabbitmqctl list_ permissions -p vhostpath:列出虛擬主機(jī)上所有權(quán)限
- rabbitmqctl delete vhost vhostpath:刪除虛擬主機(jī)
- rabbitmqctl list queues:查看所有隊(duì)列信息
- rabbitmqctl -p vhostpath purge_ queue blue:清除隊(duì)列里的消息
- rabbitmqctl reset:移除所有數(shù)據(jù),要在rabbitmqctl stop_ app之后使用
- rabbitmqctl join_cluster < clusternode > [- -ram] :組成集群命令
- rabbitmqctl cluster status: 查看集群狀態(tài)
- rabbitmqctl change_ cluster_ node type disc | ram 修改集群節(jié)點(diǎn)的存儲(chǔ)形式
- rabbitmqctl forget_ cluster_ node [--offline]忘記節(jié)點(diǎn)(摘除節(jié)點(diǎn))
- rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2...]修改節(jié)點(diǎn)名稱
實(shí)操
-
查看端口占用
-
ctl命令
10.2 管控臺(tái)的管理
-
主界面
-
主界面-監(jiān)測(cè)全部信息
-
主界面-當(dāng)前節(jié)點(diǎn)的狀態(tài)
-
主界面-當(dāng)前節(jié)點(diǎn)一些存儲(chǔ)路徑
-
主界面-端口號(hào)集錦
-
主界面-配置文件的導(dǎo)入導(dǎo)出
-
管控臺(tái)connection界面
-
管控臺(tái)channel界面
-
管控臺(tái)queues界面
-
管控臺(tái)Exchanges界面
-
管理員界面-添加用戶
-
管理員界面-添加虛擬主機(jī)
-
管理員界面-集群管理
13 Exchange交換機(jī)
Exchange:接收消息,并根據(jù)路由鍵轉(zhuǎn)發(fā)消息所綁定的隊(duì)列
藍(lán)色 - Send Message:把消息投遞到交換機(jī),由路由鍵路由到指定的隊(duì)列
13.1 交換機(jī)屬性
除交換機(jī)類型外厉萝,在聲明交換機(jī)時(shí)還可以附帶許多其他的屬性恍飘,其中最重要的幾個(gè)分別是:
- Name:交換機(jī)名稱
- Type:交換機(jī)類型direct、topic谴垫、 fanout章母、 headers
- Durability:是否需要持久化。如果持久化翩剪,則RabbitMQ重啟后乳怎,交換機(jī)還存在
- Auto-delete:當(dāng)最后一個(gè)綁定到Exchange 上的隊(duì)列刪除后,自動(dòng)刪除該Exchange
- Internal:當(dāng)前Exchange是否于RabbitMQ內(nèi)部使用肢专,默認(rèn)為False
13.2 交換機(jī)類型
交換機(jī)主要包括如下4種類型:
Direct exchange(直連交換機(jī))
Fanout exchange(扇型交換機(jī))
Topic exchange(主題交換機(jī))
Headers exchange(頭交換機(jī))
另外RabbitMQ默認(rèn)定義一些交換機(jī):
默認(rèn)交換機(jī)
amq.* exchanges
還有一類特殊的交換機(jī):Dead Letter Exchange(死信交換機(jī))
13.2.1 Direct Exchange
所有發(fā)送到DE的消息被轉(zhuǎn)發(fā)到RouteKey中指定的Queue
注意: Direct模式可以使用RabbitMQ自帶的Exchange: default Exchange,所以不需要將Exchange進(jìn)行任何綁定(binding)操作,消息傳遞時(shí)舞肆,RouteKey必須完全匹配才會(huì)被隊(duì)列接收,否則該消息會(huì)被拋棄.
13.2.2 Direct Exchange原理示意圖
13.2.3 Direct Exchange實(shí)操演示
-
Pro
-
Con
注意路由key保持一致!,分別啟動(dòng)
13.2.2 Topic exchange
盡管使用直接交換改進(jìn)了我們的系統(tǒng)博杖,它仍然有局限性 - 不能做基于多個(gè)標(biāo)準(zhǔn)的路由.
在我們的日志系統(tǒng)中椿胯,我們可能不僅要根據(jù)嚴(yán)重性訂閱日志,還要根據(jù)發(fā)出日志的源來(lái)訂閱日志剃根。你可能從syslog unix工具中了解這個(gè)概念哩盲,它根據(jù)嚴(yán)重性(info / warn / crit ...)和facility(auth / cron / kern ...)來(lái)路由日志。
這會(huì)給我們很多靈活性 - 我們可能想要監(jiān)聽(tīng)來(lái)自'cron'的關(guān)鍵錯(cuò)誤以及來(lái)自'kern'的所有日志狈醉。
為了在我們的日志記錄系統(tǒng)中實(shí)現(xiàn)這一點(diǎn)廉油,我們需要了解更復(fù)雜的主題交換機(jī).
*可以匹配一個(gè)單詞
-
可以匹配零個(gè)或多個(gè)單詞。
所有發(fā)送到Topic Exchange的消息會(huì)被轉(zhuǎn)發(fā)到所有關(guān)心RouteKey中指
定Topic的Queue上Exchange將RouteKey和某Topic進(jìn)行模糊匹配苗傅,此時(shí)隊(duì)列需要綁定一個(gè)Topic
13.2.2.1 實(shí)例1
在這個(gè)例子中抒线,我們將發(fā)送所有描述動(dòng)物的消息。消息將與包含三個(gè)單詞(兩個(gè)點(diǎn))的routing key一起發(fā)送.
routing key中的第一個(gè)單詞描述速度渣慕,第二顏色嘶炭,第三是物種:“<speed>。<color>逊桦。<species>”眨猎。
我們創(chuàng)建了三個(gè)綁定:Q1綁定了綁定鍵“* .orange.”,Q2綁定了“.*.rabbit”和“l(fā)azy.G烤”
這些綁定可以總結(jié)為:
- Q1對(duì)所有橙色動(dòng)物感興趣
- Q2希望聽(tīng)到關(guān)于兔子的一切睡陪,以及關(guān)于懶惰動(dòng)物的一切
routing key設(shè)置為“quick.orange.rabbit”的消息將傳遞到兩個(gè)隊(duì)列。消息“l(fā)azy.orange.elephant”也將同時(shí)發(fā)送給他們.
另一方面
- “quick.orange.fox”只會(huì)轉(zhuǎn)到第一個(gè)隊(duì)列
- 而“l(fā)azy.brown.fox”只會(huì)轉(zhuǎn)到第二個(gè)隊(duì)列
- “l(fā)azy.pink.rabbit”將僅傳遞到第二個(gè)隊(duì)列一次,即使它匹配兩個(gè)綁定
- “quick.brown.fox”與任何綁定都不匹配兰迫,因此它將被丟棄信殊。
如果我們違背我們的約定并發(fā)送帶有一個(gè)或四個(gè)單詞的消息,例如“orange” or “quick.orange.male.rabbit”逮矛,會(huì)發(fā)生什么?好吧,這些消息將不會(huì)匹配任何綁定,因此將丟失.
另一方面鸡号,“l(fā)azy.orange.male.rabbit”转砖,雖然它有四個(gè)單詞须鼎,也會(huì)匹配最后一個(gè)綁定,并將被傳遞到第二個(gè)隊(duì)列府蔗。
實(shí)例圖
實(shí)操演示
-
Pro
-
Con
-
啟動(dòng)消費(fèi)者:
-
啟動(dòng)生產(chǎn)者:
消費(fèi)端收到了消息
-
修改匹配格式,理論上只能接受前兩個(gè)消息
-
注意在管控臺(tái),先將之前的匹配綁定取消!
-
顯然僅能接受前兩個(gè)消息
小結(jié)
主題交換機(jī)功能強(qiáng)大晋控,可以像其他交換機(jī)一樣運(yùn)行。
當(dāng)隊(duì)列綁定“P粘啵”(哈希)綁定key時(shí) - 它將接收所有消息赡译,而不管routing key - 就像在fanout交換機(jī)一樣
當(dāng)特殊字符“*”(星號(hào))和“#”(哈希)未在綁定中使用時(shí)不铆,主題交換機(jī)的行為就像直接交換機(jī)一樣蝌焚。
13.2.3 Fanout Exchange
- 不處理路由鍵,只需要簡(jiǎn)單的將隊(duì)列綁定到交換機(jī)上
- 發(fā)送到交換機(jī)的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊(duì)列上
-
Fanout交換機(jī)轉(zhuǎn)發(fā)消息是最快的
實(shí)操演示
-
Con
-
Pro
-
啟動(dòng)消費(fèi)端
-
不需要routing key
-
啟動(dòng)生產(chǎn)者后接收到的消息
14 綁定(Binding)
- Exchange和Exchange誓斥、Queue之間的連接關(guān)系
- Binding中可以包含RoutingKey或者參數(shù)
15 Queue-消息隊(duì)列
- 消息隊(duì)列只洒,實(shí)際存儲(chǔ)消息數(shù)據(jù)
- Durability: 是否持久化,Durable: 是劳坑,Transient: 否
- Auto delete:如選yes,代表當(dāng)最后一個(gè)監(jiān)聽(tīng)被移除之后,該Queue會(huì)自動(dòng)被刪除.
16 Message-消息
- 服務(wù)器和應(yīng)用程序之間傳送的數(shù)據(jù)
- 本質(zhì)上就是一段數(shù)據(jù)毕谴,由Properties和Payload ( Body )組成
16.1 常用屬性
delivery mode、headers (自定義屬性)
content_ type. content_ encoding. priority
correlation id. reply to
expiration - 過(guò)期時(shí)間
這里就牽涉到RabbitMQ的TTL機(jī)制
message_ id
timestamp. type. user id. app_ id. cluster id
實(shí)操演示
-
Con
-
啟動(dòng)消費(fèi)端
-
Pro,注意TTL為10s
-
接著啟動(dòng)Pro,Con接收消息
-
現(xiàn)在5條消息,10s后為0消息全部已清除
17 總結(jié)
首先講解互聯(lián)網(wǎng)大廠為什么選擇RabbitMQ? RabbitMQ的高性能之道是如何做到的距芬?什么是AMPQ高級(jí)協(xié)議涝开?AMPQ核心概念是什么?RabbitMQ整體架構(gòu)模型是什么樣子的框仔?RabbitMQ消息是如何流轉(zhuǎn)的舀武?RabbitMQ安裝與使用命令行與管控臺(tái),RabbitMQ消息生產(chǎn)與消費(fèi)离斩,RabbitMQ交換機(jī)詳解银舱,RabbitMQ隊(duì)列、綁定捐腿、虛擬主機(jī)纵朋、消息等...
通過(guò)本文的學(xué)習(xí),希望大家對(duì)RabbitMQ有一個(gè)整體的感知!