RabbitMQ實(shí)戰(zhàn)-基礎(chǔ)概念

1 為什么是你? RabbitMQ

RabbitMQ是一個(gè)開源的消息代理和隊(duì)列服務(wù)器,通過普通協(xié)議在完全不同的應(yīng)用之間共享數(shù)據(jù),使用Erlang語言編寫,并且基于AMQP協(xié)議.

1.1 大廠們共同的抉擇

  • 滴滴、美團(tuán)、頭條、去哪兒、藝龍...

1.2 得天獨(dú)厚的強(qiáng)勢(shì)

  • 開源,性能優(yōu)秀,穩(wěn)定性有保障
  • 提供可靠性消息投遞模式(confirm), 返回模式 ( return )
  • 與Spring AMQP完美整合,API豐富
  • 集群模式豐富,表達(dá)式配置,HA模式,鏡像隊(duì)列模型
  • 保證數(shù)據(jù)不丟失的前提做到高可靠性、可用性

2 高性能之源

  • Erlang語言 最初在于交換機(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è)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)

4 協(xié)議模型

協(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)行消息讀寫的通道??蛻舳丝山⒍鄠€(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ī)可用它來確定如何路由一個(gè)特定消息
  • Queue:也稱為Message Queue,消息隊(duì)列,保存消息并將它們轉(zhuǎn)發(fā)給消費(fèi)者

6 RabbitMQ整體架構(gòu)與消息流轉(zhuǎn)

image

image

7 安裝

7.1 本節(jié)食用指南

  • 官網(wǎng)地址: http://www.rabbitmq.com/
  • 預(yù)先準(zhǔn)備:安裝Linux必要依賴包
  • 下載RabbitMQ必須安裝包
  • 配置文件修改

7.2 下載及安裝

7.2.1 Ubuntu環(huán)境

Linux環(huán)境參數(shù)
下載頁

image

image

image

image

image

image

image

ps -ef|grep rabbit 查看rabbitmq的啟動(dòng)情況

7.2.2 CentOS7.3

對(duì)于初學(xué)者,推薦使用一鍵式的RPM安裝方式

  • 注意與 erlang 版本的對(duì)應(yīng)關(guān)系!


    image

由于筆者使用3.6.5 版本.查看對(duì)應(yīng) erlang

image

  • 下載 erlang 環(huán)境
    image
  • 下載完畢


    image
  • rpm時(shí)報(bào)錯(cuò),缺少依賴


    image
  • 解決問題


    yum -y install openssl openssl-devel
  • 再次 rpm


    image
  • 下載 rabbitmq rpm 文件


    image
  • 下載完畢


    image
  • 安裝報(bào)錯(cuò)


    image
  • 下載 socat
    image
  • 安裝 socat


    image
  • 再次安裝 rebbitmq 即可.


    image

配置文件

  • 默認(rèn)端口號(hào)


    image
  • 編輯用戶訪問權(quán)限.
    image
  • 修改如下,暫時(shí)本地可訪問


    image

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 
  // 訪問可視化監(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
  • 訪問地址
    http://192.168.11.76:15672/

8.2 重啟操作

image

image

image

啟動(dòng)成功

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


    image
  • Con


    image

    由于是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í)操

  • 查看端口占用


    image
  • ctl命令


    image
image

10.2 管控臺(tái)的管理

  • 主界面


    image
  • 主界面-監(jiān)測(cè)全部信息


    image
  • 主界面-當(dāng)前節(jié)點(diǎn)的狀態(tài)


    image
  • 主界面-當(dāng)前節(jié)點(diǎn)一些存儲(chǔ)路徑


    image
  • 主界面-端口號(hào)集錦


    image
  • 主界面-配置文件的導(dǎo)入導(dǎo)出


    image
  • 管控臺(tái)connection界面


    image
  • 管控臺(tái)channel界面


    image
  • 管控臺(tái)queues界面


    image
  • 管控臺(tái)Exchanges界面
    image
  • 管理員界面-添加用戶
    image
  • 管理員界面-添加虛擬主機(jī)


    image
  • 管理員界面-集群管理


    image

13 Exchange交換機(jī)

Exchange:接收消息,并根據(jù)路由鍵轉(zhuǎn)發(fā)消息所綁定的隊(duì)列

image

藍(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原理示意圖

image

13.2.3 Direct Exchange實(shí)操演示

  • Pro


    image
  • Con


    image

注意路由key保持一致!,分別啟動(dòng)


image
image

image

image

13.2.2 Topic exchange

盡管使用直接交換改進(jìn)了我們的系統(tǒng),它仍然有局限性 - 不能做基于多個(gè)標(biāo)準(zhǔn)的路由.

在我們的日志系統(tǒng)中,我們可能不僅要根據(jù)嚴(yán)重性訂閱日志,還要根據(jù)發(fā)出日志的源來訂閱日志。你可能從syslog unix工具中了解這個(gè)概念,它根據(jù)嚴(yán)重性(info / warn / crit ...)和facility(auth / cron / kern ...)來路由日志。

這會(huì)給我們很多靈活性 - 我們可能想要監(jiān)聽來自'cron'的關(guān)鍵錯(cuò)誤以及來自'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

image

在這個(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.?!?/p>

這些綁定可以總結(jié)為:

  • Q1對(duì)所有橙色動(dòng)物感興趣
  • Q2希望聽到關(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í)例圖

image

實(shí)操演示

  • Pro


    image
  • Con


    image
  • 啟動(dòng)消費(fèi)者:


    image

    image
  • 啟動(dòng)生產(chǎn)者:


    image

    消費(fèi)端收到了消息

  • 修改匹配格式,理論上只能接受前兩個(gè)消息


    image
  • 注意在管控臺(tái),先將之前的匹配綁定取消!


    image

    image
  • 顯然僅能接受前兩個(gè)消息


    image

小結(jié)

主題交換機(jī)功能強(qiáng)大,可以像其他交換機(jī)一樣運(yùn)行。
當(dāng)隊(duì)列綁定“?!保ü#┙壎╧ey時(shí) - 它將接收所有消息,而不管routing key - 就像在fanout交換機(jī)一樣
當(dāng)特殊字符“*”(星號(hào))和“?!保ü#┪丛诮壎ㄖ惺褂脮r(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ā)消息是最快的


    image

實(shí)操演示

  • Con


    image
  • Pro


    image
  • 啟動(dòng)消費(fèi)端


    image
  • 不需要routing key


    image
  • 啟動(dòng)生產(chǎn)者后接收到的消息


    image

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)聽被移除之后,該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 - 過期時(shí)間

這里就牽涉到RabbitMQ的TTL機(jī)制

message_ id
timestamp. type. user id. app_ id. cluster id

實(shí)操演示

  • Con


    image
  • 啟動(dòng)消費(fèi)端


    image
  • Pro,注意TTL為10s


    image
  • 接著啟動(dòng)Pro,Con接收消息


    image
  • 現(xiàn)在5條消息,10s后為0消息全部已清除


    image

    image

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ī)、消息等...
通過本文的學(xué)習(xí),希望大家對(duì)RabbitMQ有一個(gè)整體的感知!

參考

RabbitMQ官網(wǎng)
mac + RabbitMQ 安裝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么叫消息隊(duì)列? 消息(Message)是指在應(yīng)用間傳送的數(shù)據(jù)。消息可以非常簡(jiǎn)單,比如只包含文本字符串,也可以更復(fù)...
    Agile_dev閱讀 2,438評(píng)論 0 24
  • 利用RabbitMQ集群橫向擴(kuò)展能力,均衡流量壓力,讓消息集群的秒級(jí)服務(wù)能力達(dá)到百萬,Google曾做過此類實(shí)驗(yàn);...
    有貨技術(shù)閱讀 3,625評(píng)論 0 1
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 16,209評(píng)論 2 11
  • 應(yīng)用場(chǎng)景 異步處理 場(chǎng)景說明:用戶注冊(cè)后,需要發(fā)注冊(cè)郵件和注冊(cè)短信,傳統(tǒng)的做法有兩種: 1.串行的方式 2.并行的...
    lijun_m閱讀 1,949評(píng)論 0 3
  • 關(guān)于消息隊(duì)列,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了,但一直沒騰出空,近來分別碰到幾個(gè)朋友聊這塊的技術(shù)選型,是時(shí)...
    中v中閱讀 2,039評(píng)論 0 20

友情鏈接更多精彩內(nèi)容