系列文章目錄
提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動(dòng)添加
消息隊(duì)列之RabbitMQ介紹
提示:寫完文章后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
前言
提示:這里可以添加本文要記錄的大概內(nèi)容:
在當(dāng)今的分布式系統(tǒng)和微服務(wù)架構(gòu)中,消息隊(duì)列扮演著至關(guān)重要的角色。它們?yōu)閼?yīng)用程序提供了一種可靠的異步通信機(jī)制,使得各個(gè)組件之間能夠高效地傳遞消息和協(xié)調(diào)工作。而在眾多的消息隊(duì)列技術(shù)中,RabbitMQ 無疑是一個(gè)備受關(guān)注和廣泛應(yīng)用的佼佼者。
RabbitMQ 是一個(gè)開源的消息隊(duì)列服務(wù)器,它基于 AMQP(Advanced Message Queuing Protocol)協(xié)議實(shí)現(xiàn)。通過使用 RabbitMQ,開發(fā)人員可以輕松地實(shí)現(xiàn)應(yīng)用程序之間的消息傳遞、異步處理和流量削峰等功能。它具有高度的可靠性、靈活性和可擴(kuò)展性,能夠處理大量的消息并發(fā),并支持多種編程語言和客戶端。
在本博客中,我將帶領(lǐng)大家深入了解 RabbitMQ 的世界。我們將探討 RabbitMQ 的核心概念、工作原理以及它的一些重要特性。我還將分享一些實(shí)際的使用場景和最佳實(shí)踐,幫助你更好地理解如何將 RabbitMQ 應(yīng)用于你的項(xiàng)目中。
無論你是一名經(jīng)驗(yàn)豐富的開發(fā)人員,還是剛剛開始接觸消息隊(duì)列的新手,我相信本博客都能為你提供有價(jià)值的信息和啟發(fā)。讓我們一起探索 RabbitMQ 的魅力,掌握它的強(qiáng)大功能,為構(gòu)建高效、可靠的應(yīng)用程序邁出堅(jiān)實(shí)的一步!
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、RabbitMQ介紹
消息隊(duì)列
MQ是Message Queue的簡稱,也就是消息隊(duì)列,消息隊(duì)列是用來消息傳遞的過程中儲(chǔ)存消息的容器。應(yīng)用于異步通信,
消息
消息是指兩臺(tái)計(jì)算機(jī)間傳遞的數(shù)據(jù)單位。消息可以是簡單的字符串,也可以是復(fù)雜的對象。
隊(duì)列
隊(duì)列是數(shù)據(jù)結(jié)構(gòu)中的概念。隊(duì)列中的數(shù)據(jù)有先進(jìn)先出、后進(jìn)后出的特點(diǎn)。
RabbitMQ
RabbitMQ 是一個(gè)開源的消息隊(duì)列服務(wù)器,基于 AMQP(Advanced Message Queuing Protocol)協(xié)議實(shí)現(xiàn),它提供了可靠的消息傳遞機(jī)制,可以確保消息不會(huì)丟失。
RabbitMQ 具有高度的靈活性,支持多種消息傳遞模式,如點(diǎn)對點(diǎn)、發(fā)布/訂閱等,以滿足不同的應(yīng)用場景。同時(shí),它還支持多種編程語言和客戶端,并提供了廣泛的客戶端庫,方便開發(fā)人員進(jìn)行開發(fā)。
在處理更高的消息吞吐量和更多的連接時(shí),RabbitMQ 可以輕松擴(kuò)展。它提供了豐富的文檔和資源,方便用戶學(xué)習(xí)和解決問題,并且擁有一個(gè)活躍的社區(qū),可以提供技術(shù)支持和交流。
二、使用Rabbit MQ的優(yōu)勢
解耦應(yīng)用
通過使用消息隊(duì)列,應(yīng)用程序的不同組件可以松耦合地通信,而無需直接相互依賴。這有助于提高應(yīng)用的靈活性和可維護(hù)性。
舉個(gè)例子:考慮一個(gè)電子商務(wù)網(wǎng)站的訂單處理系統(tǒng)。當(dāng)用戶在網(wǎng)站上下訂單時(shí),訂單系統(tǒng)需要將訂單信息發(fā)送給庫存系統(tǒng)以檢查商品庫存,同時(shí)將訂單信息發(fā)送給支付系統(tǒng)以處理支付。如果訂單系統(tǒng)直接與庫存系統(tǒng)和支付系統(tǒng)進(jìn)行通信,那么它們之間就會(huì)產(chǎn)生緊耦合。
使用 RabbitMQ,訂單系統(tǒng)可以將訂單消息發(fā)送到一個(gè)隊(duì)列中,而庫存系統(tǒng)和支付系統(tǒng)可以作為消費(fèi)者從隊(duì)列中接收訂單消息并進(jìn)行處理。這樣,訂單系統(tǒng)不再直接與庫存系統(tǒng)和支付系統(tǒng)進(jìn)行通信,而是通過消息隊(duì)列進(jìn)行解耦。
這種解耦的好處是,當(dāng)庫存系統(tǒng)或支付系統(tǒng)需要升級或維護(hù)時(shí),訂單系統(tǒng)不會(huì)受到影響。它們可以繼續(xù)發(fā)送訂單消息到隊(duì)列中,而庫存系統(tǒng)和支付系統(tǒng)可以在之后的時(shí)間處理這些消息。此外,如果訂單量突然增加,隊(duì)列可以起到緩沖的作用,確保庫存系統(tǒng)和支付系統(tǒng)不會(huì)被瞬間的高流量淹沒。
異步處理
RabbitMQ 允許應(yīng)用程序進(jìn)行異步處理,從而提高系統(tǒng)的響應(yīng)性和并發(fā)處理能力。發(fā)送方可以將消息發(fā)送到隊(duì)列后立即返回,而接收方可以在之后的時(shí)間處理消息。
流量削峰
在高并發(fā)或突發(fā)流量的情況下,RabbitMQ 可以作為緩沖區(qū)來吸收和處理大量的消息。它可以幫助系統(tǒng)抵御瞬間的峰值負(fù)載,避免應(yīng)用程序崩潰或性能下降。
高可靠性
RabbitMQ 提供了可靠的消息傳遞機(jī)制,確保消息不會(huì)丟失。即使在發(fā)送方或接收方出現(xiàn)故障的情況下,消息也可以被存儲(chǔ)在隊(duì)列中,并在系統(tǒng)恢復(fù)后重新處理。
三、使用Rabbit MQ的劣勢
- 系統(tǒng)可用性降低 系統(tǒng)引入的外部依賴越多,系統(tǒng)穩(wěn)定性越差。一旦MQ宕機(jī),就會(huì)對業(yè)務(wù)造成影響。
- 系統(tǒng)復(fù)雜度提高 MQ的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)間是同步的遠(yuǎn)程調(diào)用,現(xiàn)在是通過MQ進(jìn)行異步調(diào)用。
- 一致性問題 A系統(tǒng)處理完業(yè)務(wù),通過MQ給B、C、D三個(gè)系統(tǒng)發(fā)消息數(shù)據(jù),如果B系統(tǒng)、C系統(tǒng)處理成功,D系統(tǒng)處理失敗,則會(huì)造成數(shù)據(jù)處理的不一致。
四、RabbitMQ的應(yīng)用場景
秒殺活動(dòng)
對于搶紅包、搶車票等秒殺活動(dòng),一瞬間便會(huì)有大量請求打過來,如果直接處理,會(huì)浪費(fèi)很多資源,我們可以先將請求放到MQ中,先請求的秒殺成功,后請求的秒殺失敗。
消息分發(fā)
如電商網(wǎng)站要推送促銷信息,該業(yè)務(wù)耗費(fèi)時(shí)間較多,但對時(shí)效性要求不高,可以使用MQ做消息分發(fā)。
數(shù)據(jù)同步
假如我們需要將數(shù)據(jù)保存到數(shù)據(jù)庫之外,還需要一段時(shí)間將數(shù)據(jù)同步到緩存(如Redis)、搜索引擎(如Elasticsearch)中。此時(shí)可以將數(shù)據(jù)庫的數(shù)據(jù)作為消息發(fā)送到MQ中,并同步到緩存、搜索引擎中。
異步處理
在電商系統(tǒng)中,訂單完成后,需要及時(shí)的通知子系統(tǒng)(進(jìn)銷存系統(tǒng)發(fā)貨,用戶服務(wù)積分,發(fā)送短信)進(jìn)行下一步操作。為了保證訂單系統(tǒng)的高性能,應(yīng)該直接返回訂單結(jié)果,之后讓MQ通知子系統(tǒng)做其他非實(shí)時(shí)的業(yè)務(wù)操作。這樣能保證核心業(yè)務(wù)的高效及時(shí)。
五、RabbitMQ的工作原理
- 生產(chǎn)者(Producer):生產(chǎn)者將消息發(fā)送到 RabbitMQ 隊(duì)列中。生產(chǎn)者可以是應(yīng)用程序或服務(wù),它們將消息發(fā)送到 RabbitMQ 隊(duì)列以進(jìn)行后續(xù)處理。
- 連接(Connection):生產(chǎn)者/消費(fèi)者和RabbitMQ服務(wù)器之間建立的TCP連接。
- 信道(Channel):是TCP里面的虛擬連接。例如:Connection相當(dāng)于電纜,Channel相當(dāng)于獨(dú)立光纖束,一條TCP連接中可以創(chuàng)建多條信道,增加連接效率。無論是發(fā)布消息、接收消息、訂閱隊(duì)列都是通過信道完成的。
- Broker:消息隊(duì)列服務(wù)器實(shí)體。即RabbitMQ服務(wù)器
- Virtual host:虛擬主機(jī)。出于多租戶和安全因素設(shè)計(jì)的,把AMQP的基本組件劃分到一個(gè)虛擬的分組中。每個(gè)vhost本質(zhì)上就是一個(gè)mini版的RabbitMQ服務(wù)器,擁有自己的隊(duì)列、交換機(jī)、綁定和權(quán)限機(jī)制。當(dāng)多個(gè)不同的用戶使用同一個(gè)RabbitMQ服務(wù)器時(shí),可以劃分出多個(gè)虛擬主機(jī)。RabbitMQ默認(rèn)的虛擬主機(jī)路徑是/。
- 交換機(jī)(Exchange):交換機(jī)是RabbitMQ 中的一個(gè)組件,用于將消息從生產(chǎn)者發(fā)送到隊(duì)列。交換機(jī)可以根據(jù)消息的內(nèi)容或?qū)傩詫⑵浒l(fā)送到不同的隊(duì)列中。
- 隊(duì)列(Queue):RabbitMQ 隊(duì)列是一個(gè)存儲(chǔ)消息的容器。隊(duì)列可以被多個(gè)消費(fèi)者同時(shí)消費(fèi),消息在隊(duì)列中按照先進(jìn)先出(FIFO)的原則進(jìn)行存儲(chǔ)。
- 綁定(Binding):綁定是RabbitMQ 中的一個(gè)配置,用于將交換機(jī)和隊(duì)列關(guān)聯(lián)起來。通過綁定,生產(chǎn)者可以將消息發(fā)送到特定的交換機(jī),而交換機(jī)則可以將消息轉(zhuǎn)發(fā)到指定的隊(duì)列中。
- 消費(fèi)者(Consumer):消費(fèi)者從 RabbitMQ 隊(duì)列中獲取消息并進(jìn)行處理。消費(fèi)者可以是應(yīng)用程序或服務(wù),它們從隊(duì)列中獲取消息并進(jìn)行后續(xù)的處理或存儲(chǔ)。
當(dāng)生產(chǎn)者將消息發(fā)送到 RabbitMQ 時(shí),它會(huì)將消息發(fā)送到指定的交換機(jī)。交換機(jī)根據(jù)綁定規(guī)則將消息轉(zhuǎn)發(fā)到相應(yīng)的隊(duì)列中。然后,消費(fèi)者從隊(duì)列中獲取消息并進(jìn)行處理。整個(gè)過程是異步的,生產(chǎn)者和消費(fèi)者不需要等待對方完成操作,而是可以繼續(xù)進(jìn)行自己的工作。
六、RabbitMQ的使用
因?yàn)镽abbitMQ是使Erlang編寫的,所以使用RabbitMQ需要安裝Erlanghuanjing
安裝Erlang環(huán)境
1.安裝Erlang所需的依賴
yum install -y epel-release
2.添加存儲(chǔ)庫條目
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
3.安裝Erlang
yum install -y erlang
4.查看Erlang是否安裝成功
erl -version
安裝RabbitMQ
1.為了外部能夠正常訪問RabbitMQ服務(wù),先關(guān)閉防火墻
# 關(guān)閉運(yùn)行的防火墻
systemctl stop firewalld.service
# 禁止防火墻自啟動(dòng)
systemctl disable firewalld.service
2.RabbitMQ是通過主機(jī)名進(jìn)行訪問的,必須給服務(wù)器添加主機(jī)名
# 修改文件
vim /etc/sysconfig/network
# 添加如下內(nèi)容
NETWORKING=yes
HOSTNAME=itbaizhan
# 修改文件
vim /etc/hosts
# 添加如下內(nèi)容
服務(wù)器ip zhangsan
3.在Windos中下載RabbitMQ壓縮包(大家去網(wǎng)上找),使用rz命令從Windos上傳到Linux(虛擬機(jī))中。
4.安裝RabbitMQ
# 解壓RabbitMQ
tar xf rabbitmq-server-generic-unix-3.9.13.tar.xz
# 重命名:
mv rabbitmq_server-3.9.13 rabbitmq
# 移動(dòng)文件夾:
mv rabbitmq /usr/local/
5.配置環(huán)境變量
# 編輯/etc/profile文件
vim /etc/profile
#添加如下內(nèi)容
export PATH=$PATH:/usr/local/rabbitmq/sbin
# 運(yùn)行文件,讓修改內(nèi)容生效
source /etc/profile
6.開啟管控臺(tái)插件
rabbitmq-plugins enable rabbitmq_management
7.后臺(tái)運(yùn)行
# 創(chuàng)建配置文件夾
mkdir -p /usr/local/rabbitmq/etc/rabbitmq
# 創(chuàng)建配置文件
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
# 添加如下內(nèi)容
loopback_users=none
# 重啟RabbitMQ
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
8.通過管控臺(tái)訪問RabbitMQ,路徑:http://ip地址:15672,用戶名:guest,密碼:guest
9.此時(shí)會(huì)提示guest賬戶只允許本地使用,我們可以配置允許使用guest遠(yuǎn)程訪問
# 創(chuàng)建配置文件夾
mkdir -p /usr/local/rabbitmq/etc/rabbitmq
# 創(chuàng)建配置文件
vim /usr/local/rabbitmq/etc/rabbitmq/rabbitmq.conf
# 添加如下內(nèi)容
loopback_users=none
# 重啟RabbitMQ
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
Dockers安裝RabbitMQ
1.在虛擬機(jī)中安裝docker
# 安裝Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 啟動(dòng)docker
systemctl start docker
2.拉取鏡像
docker pull rabbitmq
3.啟動(dòng)RabbitMQ容器
docker run -d --hostname zhangsan --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq
4.開啟管控臺(tái)插件
# 查詢r(jià)abbitmq容器ID
docker ps
# 進(jìn)入容器
docker exec -it 容器ID /bin/bash
# 開啟管控臺(tái)插件
rabbitmq-plugins enable rabbitmq_management
# 退出容器
ctrl+p+q
5.通過管控臺(tái)訪問rabbitmq,路徑:http://ip地址:15672,用戶名:guest,密碼:guest
6.關(guān)閉RabbitMQ容器
docker stop rabbit
賬戶管理
guest賬戶默認(rèn)只允許本地使用,我們可以創(chuàng)建新賬戶遠(yuǎn)程訪問RabbitMQ
1.創(chuàng)建賬戶
# 創(chuàng)建賬戶
rabbitmqctl add_user 用戶名 密碼
2.給用戶授予管理員角色
rabbitmqctl set_user_tags 用戶名 administrator
3.給用戶授權(quán)
# "/"表示虛擬機(jī)
# itbaizhan表示用戶名
# ".*" ".*" ".*" 表示完整權(quán)限
rabbitmqctl set_permissions -p "/" itbaizhan ".*" ".*" ".*"
總結(jié)
提示:這里對文章進(jìn)行總結(jié):
文章來源:http://www.zghlxwxcb.cn/news/detail-801071.html
RabbitMQ 是一個(gè)強(qiáng)大而靈活的消息隊(duì)列解決方案,能夠幫助應(yīng)用程序?qū)崿F(xiàn)高性能、可靠的異步通信和數(shù)據(jù)處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-801071.html
到了這里,關(guān)于消息隊(duì)列之RabbitMQ介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!