MQ
消息隊列是一種「先進先出」的數據結構java
其應用場景主要包含如下3個方面shell
系統的耦合性越高,容錯性就越低。以電商應用爲例,用戶建立訂單後,若是耦合調用庫存系統、物流系統、支付系統,任何一個子系統出了故障或者由於升級等緣由暫時不可用,都會形成下單操做異常,影響用戶使用體驗。apache
使用消息隊列解耦合,系統的耦合性就會提升了。好比物流系統發生故障,須要幾分鐘才能來修復,在這段時間內,物流系統要處理的數據被緩存到消息隊列中,用戶的下單操做正常完成。當物流系統回覆後,補充處理存在消息隊列中的訂單消息便可,終端系統感知不到物流系統發生過幾分鐘故障。緩存
應用系統若是遇到系統請求流量的瞬間猛增,有可能會將系統壓垮。有了消息隊列能夠將大量請求緩存起來,分散到很長一段時間處理,這樣能夠大大提到系統的穩定性和用戶體驗。服務器
通常狀況,爲了保證系統的穩定性,若是系統負載超過閾值,就會阻止用戶請求,這會影響用戶體驗,而若是使用消息隊列將請求緩存起來,等待系統處理完畢後通知用戶下單完畢,這樣總不能下單體驗要好。數據結構
處於經濟考量目的:併發
業務系統正常時段的QPS若是是1000,流量最高峯是10000,爲了應對流量高峯配置高性能的服務器顯然不划算,這時可使用消息隊列對峯值流量削峯異步
經過消息隊列可讓數據在多個系統更加之間進行流通。數據的產生方不須要關心誰來使用數據,只須要將數據發送到消息隊列,數據使用方直接在消息隊列中直接獲取數據便可高併發
MQ
的優勢和缺點優勢:解耦、削峯、數據分發性能
缺點包含如下幾點:
系統可用性下降
系統引入的外部依賴越多,系統穩定性越差。一旦MQ宕機,就會對業務形成影響。
如何保證MQ的高可用?
系統複雜度提升
MQ的加入大大增長了系統的複雜度,之前系統間是同步的遠程調用,如今是經過MQ進行異步調用。
如何保證消息沒有被重複消費?怎麼處理消息丟失狀況?那麼保證消息傳遞的順序性?
一致性問題
A系統處理完業務,經過MQ
給B、C、D三個系統發消息數據,若是B系統、C系統處理成功,D系統處理失敗。
如何保證消息數據處理的一致性?
MQ
產品的比較常見的MQ產品包括Kafka
、ActiveMQ
、RabbitMQ
、RocketMQ
。
RocketMQ
RocketMQ
是阿里巴巴2016年MQ
中間件,使用Java
語言開發,在阿里內部,RocketMQ
承接了例如「雙11」等高併發場景的消息流轉,可以處理萬億級別的消息。
RocketMQ
RocketMQ最新版本:4.5.1
Linux64位系統
JDK1.8(64位)
yum install java-1.8.0-openjdk* -y
RocketMQ
本教程以二進制包方式安裝
目錄介紹
bin
:啓動腳本,包括shell
腳本和CMD
腳本conf
:實例配置文件 ,包括broker
配置文件、logback
配置文件等lib
:依賴jar
包,包括Netty
、commons-lang
、FastJSON
等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
內存大小
# 編輯runbroker.sh和runserver.sh修改默認JVM大小 vi runbroker.sh vi runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
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