在業務執行時,不直接操作數據庫,而是將數據通過MQ 傳輸,再MQ再調用自身的服務 操作數據庫。MQ消息屬隊列,MQ包括消息發送方與消息接收方。
RabbitMQ 是由 LShift 提供的一個 Advanced Message Queuing Protocol (AMQP) 的開源實現,由以高性能、健壯以及可伸縮性出名的 Erlang 寫成,因此也是繼承了這些優點。
AMQP 裏主要要說兩個組件:Exchange 和 Queue (在 AMQP 1.0 裏還會有變動),如下圖所示,綠色的 X 就是 Exchange ,紅色的是 Queue ,這兩者都在 Server 端,又稱作 Broker ,這部分是 RabbitMQ 實現的,而藍色的則是客戶端,通常有 Producer 和 Consumer 兩種類型:
AMQ消息隊列
基礎概念
AMQP 有四個非常重要的概念:虛擬機(virtual host),交換機(exchange),隊列(queue)和綁定(binding)。
虛擬機: 通常是應用的外在邊界,我們可以爲不同的虛擬機分配訪問權限。虛擬機可持有多個交換機、隊列和綁定。
交換機: 從連接通道(Channel)接收消息,並按照特定的路由規則發送給隊列。
隊列: 消息最終的存儲容器,直到消費客戶端(Consumer)將其取走。
綁定: 也就是所謂的路由規則,告訴交換機將何種類型的消息發送到某個隊列中。
通常的操作流程是:
(1) 消費者: 創建信息通道。
(2) 消費者: 定義消息隊列。
(3) 消費者: 定義特定類型的交換機。
(4) 消費者: 設定綁定規則 (包括交換機名稱、隊列名稱以及路由鍵)。
(5) 消費者: 等待消息。
(6) 生產者: 創建消息。
(7) 生產者: 將消息投遞給信息通道 (註明接收交換機名稱和路由鍵)。
(8) 交換機: 獲取消息,依據交換機類型決定是否匹配路由規則 (如需匹配,則對比消息路由鍵和綁定路由鍵)。
(9) 消費者: 獲取並處理消息,發送反饋。
(10) 結束: 關閉通道和連接。
mq有4種不同的交換機類型:
直連交換機:Direct exchange
扇形交換機:Fanout exchange
主題交換機:Topic exchange
首部交換機:Headers exchange
具體可參考博文:https://www.jianshu.com/p/469f4608ce5d
這篇博客中談到了每種交換機與routingKey的對應關係。
知道什麼是routingKey嗎?
我在項目中用了spring-amqp的包,整個amqp被封裝了一層,頂層是看不到諸如消息通道channel、rountingKey的,這些都被封裝了。通過跟蹤源碼發現,實際我們定義的隊列名queueName被當做routingKey來使用。
我們把定義的交換機與隊列進行綁定,實際上就是交換機與routingKey進行綁定。
整個消息流轉的流程是基於routingKey來進行的。