1. 程式人生 > >RabbitMQ 通信過程

RabbitMQ 通信過程

src 連接 持久性 過程 consumer 如果 clas 管道 消息系統

Rabbit MQ的通信過程

MQ全稱為Message Queue, 是一種分布式應用程序的的通信方法,是消費-生產者模型的典型的代表,producer往消息隊列中不斷寫入消息,而另一端consumer則可以讀取或者訂閱隊列中的消息,這點可以與數據結構中隊列的作用相類似,具有FIFO的特點。

RabbitMQ是MQ產品的典型實現,是基於AMQP協議可復用的企業消息系統。業務上,可以實現服務提供者和消費者之間的數據解耦,提供高可用性的消息傳輸機制,在實際生產中應用相當廣泛。

本文意在介紹Rabbitmq的基本原理,包括rabbitmq基本概念,組件的基本用途,通信過程等。

一:基本概念

先看圖片:

技術分享圖片

1.Message:

消息,是有消息頭和消息體組成的。消息體是不透明的,消息體是由一些可選屬性組成的,包括路由鍵(routing-key)、優先級(priority)、持久性存儲(delivery-mode)等

2.Publisher:

消息生產者,是向交換器發送消息的客戶端程序,我們可以簡單理解為就是一個Java程序

3.Exchange:

交換器,用來接收生產者發送的消息,並將這些消息路由發送給服務器中的隊列。消息要先經過交換器,再到隊列中去。

常見的三種交換器類型:

direct:發布與訂閱,完全匹配 。我們可以簡單理解為一對一的關系,一個交換器將消息發送給一個隊列,是完全匹配的

fanout:廣播,所有訂閱該廣播的隊列都可以收到該消息。廣播式交換器,不管消息的ROUTING_KEY設置為什麽,Exchange都會將消息轉發給所有綁定的Queue

topic:主題,規則匹配 。

4.Queue:

消息隊列,用來保存消息,直到發送給消費者,是消息的容器,也是消息的終點。一個消息可投入一個或多個隊列。消息一致在隊列裏面,等待消費者連接到這個隊列將其取走。

5.Bingding:

綁定,用於消息隊列和交換器之間的關聯。一個綁定就是基於路由鍵,將交換器和消息隊列連接起來的路由規則,所以可以將交換器理解為一個由綁定構成的路由表

6.Virtual Host:

虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器區域。// 也就是說虛擬主機、交換器、隊列、綁定等是通過虛擬機來實現的

每個vhost本質上就是一個mini版的RabbitMQ服務器,擁有自己的隊列、交換器、綁定和權限機制。

vhost是AMQP概念的基礎,必須再連接時指定,RabbitMQ默認的vhost是"/"

7.Broker:

可以理解為rabbitmq的服務器實體,可以理解為在Linux上創建的虛擬機實體

8.Connection:

連接,我們可以理解為:rabbitmq服務器和服務建立的TCP的連接。

9.Channel:

信道,也可以成為管道。是TCP裏的虛擬連接。一條TCP連接,可以包含很多條的Channel。

eg:電纜相當與TCP,信道是一條獨立光纖束,一條TCP連接上創建多少條信道是沒有限制的

TCP一旦打開,就會創建AMQP信道

無論是發布消息、接收消息、訂閱消息,這些動作都是通過信道完成的

10.Consumer:

消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序,和Producer類似,我們可以簡單理解為就是一個Java程序

二:通信過程:

通信過程以圖片中的內容為例:

技術分享圖片

通信過程:

1. P1生產消息,發送給服務器端的Exchange

2. Exchange收到消息,根據ROUTINKEY,將消息轉發給匹配的Queue1

3. Queue1收到消息,將消息發送給訂閱者C1

4. C1收到消息,發送ACK給隊列確認收到消息

5. Queue1收到ACK,刪除隊列中緩存的此條消息

補充:

1. 如果consumer接收了消息,發送ack,rabbitmq會刪除隊列中的這個消息,接下來發送另一條消息給consumer

2. 如果consumer接收了消息,但是再發送ack之前斷開連接,rabbitmq會認為這條消息沒被deliver,在consumer再次連接的時候,此消息會被deliver

3. 如果consumer接收了消息,由於程序中的bug,忘記發送ack,rabbitmq不會重復發送該消息

4. rabbitmq2.0.0之後的版本支持consumer 拒絕reject某條(類)消息,可以通過設置requeue參數中的reject=true屬性,那麽rabbitmq會把消息發送給下一個註冊的consumer

RabbitMQ 通信過程