Message Queue(訊息佇列)。是指在訊息的傳輸過程中儲存訊息的容器,,多用於分佈式系統之間進行通訊。
遠端呼叫帶來的下面 下麪的耦合
可以看出這個遠端呼叫帶來的問題就是,系統的耦合性高,容錯性低。可維護性也低
我們來看看使用中介軟體的解耦
使用MQ是的應用間解耦,提升容錯性和可維護性
我們來看看這個同步帶來的問題
下單耗時是:20+300+300+300=920ms
使用者點選下單按鈕以後,需要等待920ms,這樣系統的響應時間太長。
我們再來看這個MQ的非同步提速
這裏的下單響應時間是:20+5=25ms
不精提高了使用者體驗和系統的吞吐量
使用了這個MQ之後呢,就限制了消費的速度是1000,這樣高峯期產生的數據勢必會積壓在MQ中,因此削去了高峯,因爲訊息的積壓,爲高峯期過後的一段時間內,還是維持在1000,直到消除積壓,就叫填谷
系統可用性降低
系統引入的外部依賴多系統穩定性就越差,MQ宕機,就會對業務造成影響,因此保證MQ的高可用是問題的關鍵
系統複雜度提高
MQ的加入大大提高了系統的複雜度,以前系統間是同步的遠端呼叫,現在是通過MQ進行非同步呼叫,問題的關鍵就在於:
一致性問題
A處理了業務,通過MQ給BCD業三個系統都發送訊息數據,那麼如何保證訊息數據處理的一致性?
AMQP:Advanced Message Queuing(高階訊息佇列協定),是一個網路協定,是應用層協定的一個開放標準,爲訊息導向中介層設計。
JMS即Java訊息服務(JavaMessage Service)應用程式介面,是一個Java平臺中關於訊息導向中介軟體(MOM)的API,用於在兩個應用程式之間,或分佈式系統中發送訊息,進行非同步通訊。
由ErLang語言開發
# 第一步
rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
# 第二步
#=========================================
# centos7 用這個
cat <<EOF > /etc/yum.repos.d/rabbitmq.repo
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/7/
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOF
# centos6 用這個
cat <<EOF > /etc/yum.repos.d/rabbitmq.repo
[bintray-rabbitmq-server]
name=bintray-rabbitmq-rpm
baseurl=https://dl.bintray.com/rabbitmq/rpm/rabbitmq-server/v3.8.x/el/6/
gpgcheck=0
repo_gpgcheck=0
enabled=1
EOF
# ==============================================
# 第三步
yum makecache
# 第四步
yum install socat
#第五步
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.8.12/erlang-21.3.8.12-1.el7.x86_64.rpm
rpm -ivh erlang-21.3.8.12-1.el7.x86_64.rpm --force --nodeps
# 第六部
yum install rabbitmq-server
# 設定服務自啓動
systemctl enable rabbitmq-server
# 啓動服務
systemctl start rabbitmq-server
# 開啓管理介面外掛
rabbitmq-plugins enable rabbitmq_management
# 防火牆開啓 15672 管理埠(這是一個好習慣)
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
# 開啓用戶端連線埠
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload
# 或者關掉防火牆
systemctl stop firewalld.service
# 新增使用者(使用者名稱是Admin 密碼也是Admin)
rabbitmqctl add_user admin admin
# 新使用者設定使用者爲超級管理員
rabbitmqctl set_user_tags admin administrator
# 重新啓動
systemctl restart rabbitmq-server
RabbitMQ 提供了 6 種工作模式