1.RocketMQ介紹
1.1爲什麼要用MQ
消息隊列是一種“先進先出”的數據結構
其應用場景主要包含以下三個方面
應用解耦
系統的耦合性越高,容錯性就約低。以電商應用爲例子,用戶創建訂單後,如果耦合調用庫存系統、物流系統、支付系統、任何一個子系統出了故障或者因爲升級等原因暫時不可用,都會造成下單操作異常,影響用戶使用體驗
使用消息隊列解耦,系統耦合性就會提高。比如物流系統發生故障,需要幾分鐘才能修復,這段時間內,物流系統要處理的數據被緩存到消息隊列中,用戶的下單操作正常完成。當物流系統回覆後,補充處理存在消息隊列中的訂單消息即可,中斷系統感知不到物流系統發生過幾分鐘故障。
流量削峯
應用系統如果遇到系統請求流量的瞬間猛增,有可能會將系統壓垮。有了消息隊列可以將大量請求緩存起來,分散到很長一段時間處理,這樣可以大大提高系統的穩定性和用戶體驗。
一般情況,爲了保證系統的穩定性,如果系統負載超過閾值,就會組織用戶請求,這樣會影響用戶體驗,而如果使用消息隊列將請求緩存起來,等待系統處理完畢後通知用戶下單完畢,這樣總不能下單體驗要好。
處於經濟考量目的:
業務系統正常時間段的QPS如果是1000,流量高峯時10000,爲了應對流量高峯配置高性能的服務器顯然不划算,這時可以使用消息隊列對峯值流量削峯。
數據分發
通過消息隊列可以讓數據在多個系統更加之間進行流通。數據的產生方不需要關心誰來使用數據,只需要將數據發送到消息碎裂,數據使用方直接在消息隊列中直接獲取數據即可
1.2 MQ的優點和缺點
優點:解耦、削峯、數據分發
缺點包含以下幾點
- 系統可用性降低
系統引入的外部依賴越多,系統穩定性越差。一旦MQ宕機,就會對業務造成影響
如何保證MQ的高可用 - 系統複雜度提高
MQ的加入大大增加了系統的複雜度,以前系統間是同步的遠程調用,現在是通過MQ進行異步調用。如何保證消息沒有被重複消費?怎麼處理消息丟失情況?那麼保證消息傳遞的順序性? - 一致性問題
A系統處理完業務,通過MQ給B、C、D三個系統發消息數據,如果B系統、C系統處理成功,D系統處理失敗。如何保證消息數據處理的一致性?
1.3各種MQ產品的比較
常見的MQ產品包括Kafka、ActiveMQ RabbitMq PocketMQ
2. RocketMQ 快速入門
RockertMQ是阿里巴巴2016年MQ中間件,使用Java語言開發,在阿里欸不,RocketMQ承接了例如“雙11”等高併發場景的消息流轉,能夠處理萬億級別的消息
2.1 準備工作
下載安裝RocketMQ
2.2 啓動RocketMQ
- 啓動NameServer
1 啓動NameServer
nohup sh bin/mqnamesrv &
2 查看啓動日誌
tail -f ~/logs/rocketmqlogs/namesrv.log
- 啓動Broker
1 啓動Broker
nohup sh /bin/mqbroker -n localhost:9876 &
2 查看啓動日誌
tail -f ~/logs/rocketmqlogs/broker.log
- 問題描述
RocketMQ 默認的虛擬機內存較大,啓動Broker如果因爲內存不足失敗,需要編輯如下兩個配置文件,修改JVM內存大小
編輯runbrocker.sh 和runserver.sh修改默認JVM大小
vi runbroker.sh
vi runserver.sh
- 參考設置
2.3 測試RocketMQ
發送消息
1 設置環境變量
export NAMESRV_ADDR=localhost:9876
2 使用安裝包的Demo發送信息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
接受消息
1 設置環境變量
export NAMESRV_ADDR=localhost:9876
2 接受消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
關閉RocketMQ
1 關閉NameServer
sh bin/mqshutdown namesrv
2 關閉Broker
sh bin/mqshutdown broker