RabbitMQ訊息模式
各個模式相關代碼及筆記md已匯總至gitHub專區:
RabbitMQStudy
1.RabbitMQ架構
1.1.RabbitMQ核心組成

核心概念:
Server:又稱Broker ,接受客戶端的連接,實作AMQP物體服務, 安裝rabbitmq-server
Connection:連接,應用程式與Broker的網路連接 TCP/IP/ 三次握手和四次揮手
Channel:網路信道,幾乎所有的操作都在Channel中進行,Channel是進行訊息讀寫的通道,客戶端可以建立對各Channel,每個Channel代表一個會話任務,
Message :訊息:服務與應用程式之間傳送的資料,由Properties和body組成,Properties可是對訊息進行修飾,比如訊息的優先級,延遲等高級特性,Body則就是訊息體的內容,
Virtual Host 虛擬地址,用于進行邏輯隔離,最上層的訊息路由,一個虛擬主機理由可以有若干個Exhange和Queueu,同一個虛擬主機里面不能有相同名字的Exchange
Exchange:交換機,接受訊息,根據路由鍵發送訊息到系結的佇列,(==不具備訊息存盤的能力==)
Bindings:Exchange和Queue之間的虛擬連接,binding中可以保護多個routing key.
Routing key:是一個路由規則,虛擬機可以用它來確定如何路由一個特定訊息,
Queue:佇列:也成為Message Queue,訊息佇列,保存訊息并將它們轉發給消費者,
1.2.RabbitMQ整體架構

從架構圖中我們可以看出:RabbitMQ架構包含了:Provider(生產者)、Exchanges(交換機)、Queues(佇列)、Consumer(消費者),
1.3.RabbitMQ的運行流程

生產者將業務方資料進行可能的包裝, 之后封裝成訊息, 發送( AMQP 協議里這個動作對應的命令為Basic.Publish) 到Broker 中,消費者訂閱并接收訊息(AMQP 協議里這個動作對應的命令為Basic.Consume 或者Basic. Get) ,經過可能的解包處理得到原始的資料,之后再進行業務處理邏輯,這個業務處理邏輯并不一定需要和接收訊息的邏輯使用同一個執行緒,
消費者行程可以使用一個執行緒去接收訊息,存入到記憶體中,比如使用Java 中的BlockingQueue ,業務處理邏輯使用另一個執行緒從記憶體中讀取資料,這樣可以將應用進一步解稿,提高整個應用的處理效率,
詳細的執行流程程序涉及到的底層通信原理比較復雜,有興趣的可以了解另一篇博文,寫的非常詳細,這里就不再做過多地闡述:
rabbitMQ基本概念
rabbitMQ運轉流程
2.RabbitMQ支持的訊息模式
參考官網:https://www.rabbitmq.com/getstarted.html
2.1.簡單模式 Simple

在簡單模式的訊息發送中,不需要特別創建交換機(指定交換機的型別),通過默認的交換機Binding Default exchange,通過指定Routing key關聯Queues中的queue name向對應的Queue佇列發送訊息,
注意:
rabbitmq發送訊息一定有一個交換機,如果沒有創建交換機,默認使用Default_exchange進行系結,


最終向queue1中發送訊息,獲取訊息內容如下:

Ack Mode:訊息應答模式

Nack message:接收訊息后不對訊息進行應答,及消費者不會回復反饋給生產者,Queue中仍然會保存訊息;
Ack message:接收訊息并應答,此時生成者受到消費者回復,將Queue中該條訊息消費,
2.2.作業佇列模式 WorkQueues

作業佇列模式也是指定的默認的default默認交換機對多個Queue消費者進行訊息的發送,
主要有兩種模式:
1、輪詢模式分發:一個消費者一條,按均分配,平均分,不會因為哪個消費者內部處理速率較快而減少訊息的發送;
2、公平分發:根據消費者的消費能力進行公平分發,處理快的處理的多,處理慢的處理的少;按勞分配;
實際代碼上的區別就是公平分發一定要設定應答方式為手動應答,而輪詢模式設定為自動應答:
//根據實際場景設定:取決于服務的處理速度、磁盤空間等,為1表示每次只消費1條
finalChannel.basicQos(1); //公平分發一定需要手動應答 finalChannel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
2.3.發布訂閱模式 Publish/Subscribe

發布訂閱模式使用fanout型別交換機系結每一個消費者Queue佇列,相當于廣播的形式,訂閱了該交換機(頻道)的Queue都會收到通過交換機發送的來自生產者的訊息,
而在此程序中消費者Queues必須與fanout_exchange進行一對一系結,


2.4.路由模式Routing

路由模式的交換機型別是:direct型別
路由模式與發布訂閱模式非常相似,也非常容易理解,它只是在發布訂閱模式上新增了路由key,通過對應的路由key與對應的Queue進行系結,這個Queue就被key唯一標識了,
然后當交換機再去發送訊息的時候,會在系結了交換機的Queue中指定對應的路由key進行發送,只有對應路由key為發送key一一對應的才能收到訊息,

測驗發給Routing key為error的queue佇列(佇列都系結了路由direct_exchange):



2.5.主題Topic模式

主題模式topics相較于路由模式是非常相似的,只不過在路由的基礎之上增加了支持模糊匹配的Routing key的形式,
主題模式的交換機型別選擇必須是topic型別,
匹配規則:
#:表示0個或者多個,取值范圍為[0,+無窮大)
*:表示1個,取值為1,即必須要有一個,
測驗佇列Routing key如下,都系結上了topic主題型別的交換機:


可以看到,只有queue1與queue2收到了對應的訊息:

2.6.引數模式
引數模式的exchange型別為:headers,
引數模式會在路由匹配時根據相應的Queue攜帶的引數資訊進行匹配,而exchange則根據arguement引數進行一對一發送:
Arguments資訊標識,測驗選擇x=1的佇列進行發送:


可以看到queue1中已經收到了訊息:

3.總結
RabbitMQ支持的訊息模式:
簡單模式 Simple
- 交換機型別:default
- 特點:通過默認交換機實作一對一分發
作業模式 Work
- 交換機型別:default
- 特點:輪詢分發:按均分配;公平分發:按勞分配;
發布訂閱模式
- 交換機型別:fanout
- 特點:訂閱頻道,每個佇列與交換機系結,都能收到訊息
路由模式
- 交換機型別:direct
- 特點:有route key作為標識,發送訊息時通過路由key進行一對一發送,實際性能會有所損耗
主題模式
- 交換機型別:topic
- 特點:在route key基礎上增加了模糊匹配,#:0個或者多個;*:必須有一個
引數模式
- 交換機型別:headers
- 特點:攜帶引數Arguments,實際發送與有對應引數的佇列相匹配進行發送
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276901.html
標籤:Java

