前言
RabbitMQ:高併發、高可用。
幾年前學習過RabbitMQ,但是筆記沒有做好,而且隨著工作的深入,很多不理解的東西需要重新規劃。
基礎篇:概念、應用場景、基本安裝。
核心篇:基本訊息、工作佇列、釋出訂閱、路由、主題。
進階篇:普通叢集、映象佇列、負載均衡、監控心跳。
1.訊息佇列概念和場景
1.1概念
訊息佇列全稱MessageQueue,簡稱MQ。本質是一個佇列,FIFO先進先出,只不過佇列中存放的內容是message,從而稱為訊息佇列(訊息+佇列)。
主要用途:不同服務server、程序process、執行緒thread之間通訊。
Broker
Broker的概念來自與Apache ActiveMQ,通俗的講就是MQ的伺服器。
生產者和消費者
訊息生產者Producer:傳送訊息到訊息佇列。
訊息消費者Consumer:從訊息佇列接收訊息。
點對點(執行緒池)
訊息生產者向一個特定的佇列傳送訊息,訊息消費者從該佇列中接收訊息。
一條訊息只有一個消費者能收到。
釋出訂閱
實際操作過程中,釋出訂閱訊息模型中,支援向一個特定的主題Topic釋出訊息,0個或多個訂閱者接收來自這個訊息主題的訊息。在這種模型下,釋出者和訂閱者彼此不知道對方。
必須先訂閱,再傳送訊息,而後接收訂閱的訊息,這個順序必須保證。
訊息的順序性保證
基於Queue訊息模型,利用FIFO先進先出的特性,可以保證訊息的順序性。
訊息的ACK確認機制
即訊息的Ackownledge確認機制,為了保證訊息不丟失,訊息佇列提供了訊息Acknowledge機制,即ACK機制,當Consumer確認訊息已經被消費處理,傳送一個ACK給訊息佇列,此時訊息佇列便可以刪除這個訊息了。
如果Consumer當機/關閉,沒有傳送ACK,訊息佇列將認為這個訊息沒有被處理,會將這個訊息重新傳送給其他的Consumer重新消費處理。
透過犧牲吞吐量獲得實時性。
訊息的持久化
訊息的持久化,對於一些關鍵的核心業務來說是非常重要的,啟用訊息持久化後,訊息佇列當機重啟後,訊息可以從持久化儲存恢復,訊息不丟失,可以繼續消費處理。
對於生產者,將資料傳送到訊息佇列,訊息佇列會儲存多個副本,即使MQ伺服器奔潰,重啟仍能找到生產者的訊息資料。
對於消費者,拉取到訊息後,將返回一個資訊給MQ告訴它已經獲得了訊息,MQ將儲存相關資料,即使MQ伺服器奔潰,重啟仍能知道消費者已經獲取了哪些資料,避免重複傳送。
訊息佇列的非同步處理
同步:訊息的收發支援同步收發的方式。
非同步:訊息的收發同樣支援非同步方式:非同步傳送訊息,不需要等待訊息佇列的接收確認;非同步接收訊息,以Push的方式觸發訊息消費者接收訊息。
訊息佇列的事務支援
訊息的收發處理支援事務,例如:在任務中心場景中,一次處理可能涉及多個訊息的接收、處理,這處於同一個事務範圍內,如果一個訊息處理失敗,事務回滾,訊息重新回到佇列中。
1.2場景
- 削峰填谷
- 應用解耦
- 非同步處理
- 釋出訂閱
- 訊息驅動
需要根據業務場景選擇合適的訊息佇列。
2.RabbitMQ原理
Broker :即RabbitMQ的實體伺服器。提供一種傳輸服務,維護一條從生產者到消費者的傳輸線路,保證訊息資料能按照指定的方式傳輸。
Exchange :訊息交換機。指定訊息按照什麼規則路由到哪個佇列Queue。
Queue :訊息佇列。訊息的載體,每條訊息都會被投送到一個或多個佇列中。
Binding :繫結。作用就是將Exchange和Queue按照某種路由規則繫結起來。
Routing Key:路由關鍵字。Exchange根據Routing Key進行訊息投遞。定義繫結時指定的關鍵字稱為Binding Key。
Vhost:虛擬主機。一個Broker可以有多個虛擬主機,用作不同使用者的許可權分離。一個虛擬主機持有一組Exchange、Queue和Binding。
Producer:訊息生產者。主要將訊息投遞到對應的Exchange上面。一般是獨立的程式。
Consumer:訊息消費者。訊息的接收者,一般是獨立的程式。
Connection:Producer 和Consumer 與Broker之間的TCP長連線。
Channel:訊息通道,也稱通道。在客戶端的每個連線裡可以建立多個Channel,每個Channel代表一個會話任務。在RabbitMQ Java Client API中,channel上定義了大量的程式設計介面。
3.Docker Desktop安裝RabbitMQ
3.1安裝Docker Desktop
安裝Docker Desktop
地址:https://www.docker.com/products/docker-desktop/
等待安裝完成
3.2Unexpected WSL errpr
執行Docker Desktop報錯是因為電腦環境問題,請檢查電腦是否開啟支援虛擬化。
開啟工作管理員確認
啟用或關閉Windows功能檢視並安裝。
安裝後重啟,開啟Docker Desktop正常。
3.3安裝RabbitMQ
# 檢視docker版本
docker -v
# 執行rabbitmq
docker run -it -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management
docker run :建立一個新的容器並執行一個命令
- -a stdin: 指定標準輸入輸出內容型別,可選 STDIN/STDOUT/STDERR 三項;
- -d: 後臺執行容器,並返回容器ID;
- -i: 以互動模式執行容器,通常與 -t 同時使用;
- -t: 為容器重新分配一個偽輸入終端,通常與 -i 同時使用;
- -P: 隨機埠對映,容器內部埠隨機對映到主機的埠
- -p: 指定埠對映,格式為:主機(宿主)埠:容器埠
- --name="nginx-lb": 為容器指定一個名稱;
- --volume , -v: 繫結一個卷
4.RabbitMQ管理介面
訪問:http://localhost:15672/
預設賬號:guest gutest
描述、連結、通道、交換機、訊息佇列、管理員
新增一個使用者
配置一個虛擬機器
配置完畢
創作不易,感謝支援。