RabbitMQ(訊息中介軟體)

2020-08-08 09:33:25

MQ基本概念

Message Queue(訊息佇列)。是指在訊息的傳輸過程中儲存訊息的容器,,多用於分佈式系統之間進行通訊

分佈式系統兩種通訊方式

遠端RPC呼叫

在这里插入图片描述

引入訊息中介軟體

在这里插入图片描述

小結

  • MQ,訊息佇列,儲存訊息的中介軟體
  • 分佈式系統同行兩種方式:直接遠端調用和藉助第三方間接通訊
  • 發佈方成爲生產者,接收方成爲消費者。

MQ的優劣

優勢

應用解耦:提高系統容錯性和可維護性

遠端呼叫帶來的下面 下麪的耦合
在这里插入图片描述

可以看出這個遠端呼叫帶來的問題就是,系統的耦合性高,容錯性低。可維護性也低

我們來看看使用中介軟體的解耦
在这里插入图片描述

使用MQ是的應用間解耦,提升容錯性和可維護性

非同步提速:提升使用者體驗與吞吐量

我們來看看這個同步帶來的問題
在这里插入图片描述

下單耗時是:20+300+300+300=920ms
使用者點選下單按鈕以後,需要等待920ms,這樣系統的響應時間太長。

我們再來看這個MQ的非同步提速
在这里插入图片描述

這裏的下單響應時間是:20+5=25ms
不精提高了使用者體驗和系統的吞吐量

削峯填谷:使用MQ就提高了,系統的穩定性

在这里插入图片描述
在这里插入图片描述

使用了這個MQ之後呢,就限制了消費的速度是1000,這樣高峯期產生的數據勢必會積壓在MQ中,因此削去了高峯,因爲訊息的積壓,爲高峯期過後的一段時間內,還是維持在1000,直到消除積壓,就叫填谷

劣勢

  • 系統可用性降低
    系統引入的外部依賴多系統穩定性就越差,MQ宕機,就會對業務造成影響,因此保證MQ的高可用是問題的關鍵

  • 系統複雜度提高
    MQ的加入大大提高了系統的複雜度,以前系統間是同步的遠端呼叫,現在是通過MQ進行非同步呼叫,問題的關鍵就在於:

    • 如何保證訊息沒有被重複消費?
    • 如何處理訊息的丟失情況?
    • 如何保證訊息傳遞的順序性?
  • 一致性問題
    A處理了業務,通過MQ給BCD業三個系統都發送訊息數據,那麼如何保證訊息數據處理的一致性?

常見MQ

在这里插入图片描述

RabbitMQ的簡介與入門

AMQP協定

AMQP:Advanced Message Queuing(高階訊息佇列協定),是一個網路協定,是應用層協定的一個開放標準,爲訊息導向中介層設計。

在这里插入图片描述

JMS

JMS即Java訊息服務(JavaMessage Service)應用程式介面,是一個Java平臺中關於訊息導向中介軟體(MOM)的API,用於在兩個應用程式之間,或分佈式系統中發送訊息,進行非同步通訊。

RabbitMQ簡介

由ErLang語言開發

基礎架構圖

在这里插入图片描述

RabbitMQ的入門

安裝(這裏展示線上安裝,屁事少)

# 第一步
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



啓動RabbitMQ伺服器

#  設定服務自啓動
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

主要埠介紹

  • 4369 – erlang發現口
  • 5672 – client端通訊口
  • 15672 – 管理介面ui埠
  • 25672 – server間內部通訊口

新增使用者與重新啓動


# 新增使用者(使用者名稱是Admin  密碼也是Admin)
rabbitmqctl add_user admin admin

# 新使用者設定使用者爲超級管理員
rabbitmqctl set_user_tags admin administrator


# 重新啓動
systemctl restart rabbitmq-server

有如下介面,完事!

在这里插入图片描述
在这里插入图片描述

RabbitMQ的入門案例

生產者(Producer)

消費者(Consumer)

RabbitMQ的工作模式

RabbitMQ 提供了 6 種工作模式

簡單模式

work queues

Publish/Subscribe 發佈與訂閱模式、

Routing 路由模式

Topics 主題模式

RPC 遠端呼叫模式(遠端呼叫)

Spring整合RabbitMQ

RabbitMQ的高階用法