RabbitMQ概念_MQ
消息隊列
MQ全稱Message Queue(消息隊列),是在消息的傳輸過程中保存消息的容器。多用于系統之間的異步通信。
- 同步通信相當于兩個人當面對話,你一言我一語。必須及時回復
- 異步通信相當于通過第三方轉述對話,可能有消息的延遲,但不需要二人時刻保持聯系。
消息
兩臺計算機間傳送的數據單位。消息可以非常簡單,例如只包含文本字符串;也可以更復雜,可能包含嵌入對象。
隊列
數據結構中概念。在隊列中,數據先進先出,后進后出。
實時效果反饋
1. 消息隊列多用于系統間的
A 同步通信
B 異步通信
C 跨域通信
D 以上說法都不對
2. 在隊列中,數據
A 先進先出,后進后出
B 先進后出
C 后進先出
D 以上說法都不對
答案
1=>B 2=>A
RabbitMQ概念_MQ的優勢
應用解耦
在電商平臺中,用戶下訂單需要調用訂單系統,此時訂單系統還需要調用庫存系統、支付系統、物流系統完成業務。此時會產生兩個問題:
- 如果庫存系統出現故障,會造成整個訂單系統崩潰。
- 如果需求修改,新增了一個X系統,此時必須修改訂單系統的代碼。
如果在系統中引入MQ,即訂單系統將消息先發送到MQ中,MQ再轉發到其他系統,則會解決以下問題:
- 由于訂單系統只發消息給MQ,不直接對接其他系統,如果庫存系統出現故障,不影響整個訂單。
- 如果需求修改,新增了一個X系統,此時無需修改訂單系統的代碼,只需修改MQ將消息發送給X系統即可。
異步提速
如果訂單系統同步訪問每個系統,則用戶下單等待時長如下:
如果引入MQ,則用戶下單等待時長如下:
削峰填谷
假設我們的系統每秒只能承載1000請求,如果請求瞬間增多到每秒5000,則會造成系統崩潰。此時引入mq即可解決該問題
使用了MQ之后,限制消費消息的速度為1000,這樣一來,高峰期產生的數據勢必會被積壓在MQ中,高峰就被“削”掉了,但是因為消息積壓,在高峰期過后的一段時間內,消費消息的速度還是會維持在1000,直到消費完積壓的消息,這就叫做“填谷”。
實時效果反饋
1. MQ的優勢是
A 應用解耦
B 異步提速
C 削峰填谷
D 以上說法都正確
答案
1=>D
RabbitMQ概念_MQ的劣勢
- 系統可用性降低 系統引入的外部依賴越多,系統穩定性越差。一旦MQ宕機,就會對業務造成影響。
- 系統復雜度提高 MQ的加入大大增加了系統的復雜度,以前系統間是同步的遠程調用,現在是通過MQ進行異步調用。
- 一致性問題 A系統處理完業務,通過MQ給B、C、D三個系統發消息數據,如果B系統、C系統處理成功,D系統處理失敗,則會造成數據處理的不一致。
實時效果反饋
1. 關于MQ的劣勢,以下說法正確的是
A 會讓系統可用性提高
B 會讓系統可用性降低
C 會讓系統復雜度降低
D 不會產生一致性問題
答案
1=>B
RabbitMQ概念_MQ應用場景
-
搶紅包、秒殺活動、搶火車票等
這些業務場景都是短時間內需要處理大量請求,如果直接連接系統處理業務,會耗費大量資源,有可能造成系統癱瘓。
而使用MQ后,可以先讓用戶將請求發送到MQ中,MQ會先保存請求消息,不會占用系統資源,且MQ會進行消息排序,先請求的秒殺成功,后請求的秒殺失敗。
-
消息分發
如電商網站要推送促銷信息,該業務耗費時間較多,但對時效性要求不高,可以使用MQ做消息分發。
-
數據同步
假如我們需要將數據保存到數據庫之外,還需要一段時間將數據同步到緩存(如Redis)、搜索引擎(如Elasticsearch)中。此時可以將數據庫的數據作為消息發送到MQ中,并同步到緩存、搜索引擎中。
-
異步處理
在電商系統中,訂單完成后,需要及時的通知子系統(進銷存系統發貨,用戶服務積分,發送短信)進行下一步操作。為了保證訂單系統的高性能,應該直接返回訂單結果,之后讓MQ通知子系統做其他非實時的業務操作。這樣能保證核心業務的高效及時。
-
離線處理
在銀行系統中,如果要查詢近十年的歷史賬單,這是非常耗時的操作。如果發送同步請求,則會花費大量時間等待響應。此時使用MQ發送異步請求,等到查詢出結果后獲取結果即可。
實時效果反饋
1. 以下業務場景中,可以使用MQ優化的是
A 搶紅包
B 秒殺活動
C 搶火車票
D 以上場景都可以
答案
1=>D
RabbitMQ概念_AMQP
RabbitMQ是由Erlang語言編寫的基于AMQP的MQ產品。
AMQP
即Advanced Message Queuing Protocol(高級消息隊列協議),是一個網絡協議,專門為消息中間件設計。基于此協議的客戶端與消息中間件可傳遞消息,并不受不同中間件產品,不同開發語言等條件的限制。2006年AMQP規范發布,類比HTTP。
AMQP工作過程
生產者(Publisher)將消息發布到交換機(Exchange),交換機根據規則將消息分發給交換機綁定的隊列(Queue),隊列再將消息投遞給訂閱了此隊列的消費者。
實時效果反饋
1. AMQP是為設計的網絡協議
A 緩存
B Web服務器
C 消息中間件
D 數據庫
2. 在AMQP中,將消息分發給隊列
A 虛擬機
B 交換機
C 管道
D 生產者
答案
1=>C 2=>B
RabbitMQ概念_RabbitMQ工作原理
-
Producer
消息的生產者。也是一個向交換機發布消息的客戶端應用程序。
-
Connection
連接。生產者/消費者和RabbitMQ服務器之間建立的TCP連接。
-
Channel
信道。是TCP里面的虛擬連接。例如:Connection相當于電纜,Channel相當于獨立光纖束,一條TCP連接中可以創建多條信道,增加連接效率。無論是發布消息、接收消息、訂閱隊列都是通過信道完成的。
-
Broker
消息隊列服務器實體。即RabbitMQ服務器
-
Virtual host
虛擬主機。出于多租戶和安全因素設計的,把AMQP的基本組件劃分到一個虛擬的分組中。每個vhost本質上就是一個mini版的RabbitMQ服務器,擁有自己的隊列、交換機、綁定和權限機制。當多個不同的用戶使用同一個RabbitMQ服務器時,可以劃分出多個虛擬主機。RabbitMQ默認的虛擬主機路徑是
/
-
Exchange
交換機。用來接收生產者發送的消息,并根據分發規則,將這些消息分發給服務器中的隊列中。不同的交換機有不同的分發規則。
-
Queue
消息隊列。用來保存消息直到發送給消費者。它是消息的容器,也是消息的終點。消息一直在隊列里面,等待消費者鏈接到這個隊列將其取走。
-
Binding
消息隊列和交換機之間的虛擬連接,綁定中包含路由規則,綁定信息保存到交換機的路由表中,作為消息的分發依據。
-
Consumer
消息的消費者。表示一個從消息隊列中取得消息的客戶端應用程序。
RabbitMQ為什么使用信道而不直接使用TCP連接通信?
TCP連接的創建和銷毀開銷特別大。創建需要3次握手,銷毀需要4次分手。高峰時每秒成千上萬條TCP連接的創建會造成資源巨大的浪費。而且操作系統每秒處理TCP連接數也是有限制的,會造成性能瓶頸。而如果一條線程使用一條信道,一條TCP鏈接可以容納無限的信道,即使每秒成千上萬的請求也不會成為性能的瓶頸。
實時效果反饋
1. 在RabbitMQ中,是消息的生產者
A Publisher
B Consumer
C Connection
D Channel
2. 在RabbitMQ中,發布消息、接收消息是通過完成的
A Broker
B Connection
C Channel
D Exchange
答案
1=>A 2=>C
RabbitMQ安裝_安裝Erlang
RabbitMQ是使用Erlang語言編寫的,所以在安裝RabbitMQ前需要先安裝Erlang環境
-
安裝Erlang所需的依賴
yum install -y epel-release -
添加存儲庫條目
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpmrpm -Uvh erlang-solutions-1.0-1.noarch.rpm -
安裝Erlang
yum install -y erlang -
查看Erlang是否安裝成功
erl -version
實時效果反饋
1. RabbitMQ是語言編寫的
A Java
B C++
C Erlang
D JavaScript
答案
1=>C
RabbitMQ安裝_安裝RabbitMQ
-
為了外部能夠正常訪問RabbitMQ服務,先關閉防火墻
# 關閉運行的防火墻
systemctl stop firewalld.service
# 禁止防火墻自啟動
systemctl disable firewalld.service -
RabbitMQ是通過主機名進行訪問的,必須給服務器添加主機名
# 修改文件
vim /etc/sysconfig/network
# 添加如下內容
NETWORKING=yes
HOSTNAME=itbaizhan
# 修改文件
vim /etc/hosts
# 添加如下內容
服務器ip itbaizhan -
使用rz命令上傳RabbitMQ壓縮文件
-
安裝RabbitMQ
# 解壓RabbitMQ
tar xf rabbitmq-server-generic-unix-3.9.13.tar.xz
# 重命名:
mv rabbitmq_server-3.9.13 rabbitmq
# 移動文件夾:
mv rabbitmq /usr/local/ -
配置環境變量
# 編輯/etc/profile文件
vim /etc/profile
#添加如下內容
export PATH=$PATH:/usr/local/rabbitmq/sbin
# 運行文件,讓修改內容生效
source /etc/profile -
開啟管控臺插件
rabbitmq-plugins enable rabbitmq_management
-
后臺運行
#啟動rabbitmq
rabbitmq-server -detached
#停止rabbitmq
rabbitmqctl stop
? -
通過管控臺訪問RabbitMQ(15672是rabbitmq的管控臺的port,5672才是他的port)
路徑:
http://ip地址:15672
,用戶名:guest
,密碼:guest
-
此時會提示guest賬戶只允許本地使用,我們可以配置允許使用guest遠程訪問
# 創建配置文件夾
mkdir -p /usr/local/rabbitmq/etc/rabbitmq
# 創建配置文件
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
# 添加如下內容
loopback_users=none
# 重啟RabbitMQ
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
?
RabbitMQ安裝_賬戶管理
guest賬戶默認只允許本地使用,我們可以創建新賬戶遠程訪問RabbitMQ
-
創建賬戶
# 創建賬戶rabbitmqctl add_user 用戶名 密碼 -
給用戶授予管理員角色
rabbitmqctl set_user_tags 用戶名 administrator -
給用戶授權
# "/"表示虛擬機
# itbaizhan表示用戶名
# ".*" ".*" ".*" 表示完整權限
rabbitmqctl set_permissions -p "/" itbaizhan ".*" ".*" ".*" -
通過管控臺訪問rabbitmq
實時效果反饋
1. RabbitMQ新增用戶的命令為
A rabbitmqctl user
B rabbitmqctl add
C rabbitmqctl add_user
D rabbitmqctl add_group
2. RabbitMQ默認用戶名是
A admin
B rabbit
C root
D guest
答案
1=>C 2=>D
RabbitMQ安裝_管控臺
實時效果反饋
1. RabbitMQ管控臺默認端口是
A 15672
B 5672
C 3306
D 5601
答案
1=>A