1. MQ介紹
1.1 為什么要用MQ
消息隊(duì)列是一種“先進(jìn)先出”的數(shù)據(jù)結(jié)構(gòu)

其應(yīng)用場(chǎng)景主要包含以下3個(gè)方面
- 應(yīng)用解耦
系統(tǒng)的耦合性越高,容錯(cuò)性就越低。以電商應(yīng)用為例,用戶創(chuàng)建訂單后,如果耦合調(diào)用庫存系統(tǒng)、物流系統(tǒng)、支付系統(tǒng),任何一個(gè)子系統(tǒng)出了故障或者因?yàn)樯?jí)等原因暫時(shí)不可用,都會(huì)造成下單操作異常,影響用戶使用體驗(yàn)。

使用消息隊(duì)列解耦合,系統(tǒng)的耦合性就會(huì)提高了。比如物流系統(tǒng)發(fā)生故障,需要幾分鐘才能來修復(fù),在這段時(shí)間內(nèi),物流系統(tǒng)要處理的數(shù)據(jù)被緩存到消息隊(duì)列中,用戶的下單操作正常完成。當(dāng)物流系統(tǒng)回復(fù)后,補(bǔ)充處理存在消息隊(duì)列中的訂單消息即可,終端系統(tǒng)感知不到物流系統(tǒng)發(fā)生過幾分鐘故障。

- 流量削峰

應(yīng)用系統(tǒng)如果遇到系統(tǒng)請(qǐng)求流量的瞬間猛增,有可能會(huì)將系統(tǒng)壓垮。有了消息隊(duì)列可以將大量請(qǐng)求緩存起來,分散到很長一段時(shí)間處理,這樣可以大大提到系統(tǒng)的穩(wěn)定性和用戶體驗(yàn)。

一般情況,為了保證系統(tǒng)的穩(wěn)定性,如果系統(tǒng)負(fù)載超過閾值,就會(huì)阻止用戶請(qǐng)求,這會(huì)影響用戶體驗(yàn),而如果使用消息隊(duì)列將請(qǐng)求緩存起來,等待系統(tǒng)處理完畢后通知用戶下單完畢,這樣總不能下單體驗(yàn)要好。
<u>處于經(jīng)濟(jì)考量目的:</u>
業(yè)務(wù)系統(tǒng)正常時(shí)段的QPS如果是1000,流量最高峰是10000,為了應(yīng)對(duì)流量高峰配置高性能的服務(wù)器顯然不劃算,這時(shí)可以使用消息隊(duì)列對(duì)峰值流量削峰
- 數(shù)據(jù)分發(fā)

通過消息隊(duì)列可以讓數(shù)據(jù)在多個(gè)系統(tǒng)更加之間進(jìn)行流通。數(shù)據(jù)的產(chǎn)生方不需要關(guān)心誰來使用數(shù)據(jù),只需要將數(shù)據(jù)發(fā)送到消息隊(duì)列,數(shù)據(jù)使用方直接在消息隊(duì)列中直接獲取數(shù)據(jù)即可

1.2 MQ的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn):解耦、削峰、數(shù)據(jù)分發(fā)
缺點(diǎn)包含以下幾點(diǎn):
-
系統(tǒng)可用性降低
系統(tǒng)引入的外部依賴越多,系統(tǒng)穩(wěn)定性越差。一旦MQ宕機(jī),就會(huì)對(duì)業(yè)務(wù)造成影響。
如何保證MQ的高可用?
-
系統(tǒng)復(fù)雜度提高
MQ的加入大大增加了系統(tǒng)的復(fù)雜度,以前系統(tǒng)間是同步的遠(yuǎn)程調(diào)用,現(xiàn)在是通過MQ進(jìn)行異步調(diào)用。
如何保證消息沒有被重復(fù)消費(fèi)?怎么處理消息丟失情況?那么保證消息傳遞的順序性?
-
一致性問題
A系統(tǒng)處理完業(yè)務(wù),通過MQ給B、C、D三個(gè)系統(tǒng)發(fā)消息數(shù)據(jù),如果B系統(tǒng)、C系統(tǒng)處理成功,D系統(tǒng)處理失敗。
如何保證消息數(shù)據(jù)處理的一致性?
1.3 各種MQ產(chǎn)品的比較
常見的MQ產(chǎn)品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。

2. RocketMQ快速入門
RocketMQ是阿里巴巴2016年MQ中間件,使用Java語言開發(fā),在阿里內(nèi)部,RocketMQ承接了例如“雙11”等高并發(fā)場(chǎng)景的消息流轉(zhuǎn),能夠處理萬億級(jí)別的消息。
2.1 準(zhǔn)備工作
2.1.1 下載RocketMQ
RocketMQ最新版本:4.5.1
2.2.2 環(huán)境要求
Linux64位系統(tǒng)
JDK1.8(64位)
源碼安裝需要安裝Maven 3.2.x
2.2 安裝RocketMQ
2.2.1 安裝步驟
本教程以二進(jìn)制包方式安裝
- 解壓安裝包
- 進(jìn)入安裝目錄
2.2.2 目錄介紹
- bin:?jiǎn)?dòng)腳本,包括shell腳本和CMD腳本
- conf:實(shí)例配置文件 ,包括broker配置文件、logback配置文件等
- lib:依賴jar包,包括Netty、commons-lang、FastJSON等
2.3 啟動(dòng)RocketMQ
- 啟動(dòng)NameServer
# 1.啟動(dòng)NameServer
nohup sh bin/mqnamesrv &
# 2.查看啟動(dòng)日志
tail -f ~/logs/rocketmqlogs/namesrv.log
- 啟動(dòng)Broker
# 1.啟動(dòng)Broker
nohup sh bin/mqbroker -n localhost:9876 &
# 2.查看啟動(dòng)日志
tail -f ~/logs/rocketmqlogs/broker.log
-
問題描述:
RocketMQ默認(rèn)的虛擬機(jī)內(nèi)存較大,啟動(dòng)Broker如果因?yàn)閮?nèi)存不足失敗,需要編輯如下兩個(gè)配置文件,修改JVM內(nèi)存大小
# 編輯runbroker.sh和runserver.sh修改默認(rèn)JVM大小
vi runbroker.sh
vi runserver.sh
- 參考設(shè)置:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2.4 測(cè)試RocketMQ
2.4.1 發(fā)送消息
# 1.設(shè)置環(huán)境變量
export NAMESRV_ADDR=localhost:9876
# 2.使用安裝包的Demo發(fā)送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
2.4.2 接收消息
# 1.設(shè)置環(huán)境變量
export NAMESRV_ADDR=localhost:9876
# 2.接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
2.5 關(guān)閉RocketMQ
# 1.關(guān)閉NameServer
sh bin/mqshutdown namesrv
# 2.關(guān)閉Broker
sh bin/mqshutdown broker