RabbitMQ簡介

1.什麼是MQ?

來讓我copy一段百度百科的:

MQ全稱爲Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。應用程序通過讀寫出入隊列的消息(針對應用程序的數據)來通信,而無需專用連接來鏈接它們。消息傳遞指的是程序之間通過在消息中發送數據進行通信,而不是通過直接調用彼此來通信,直接調用通常是用於諸如遠程過程調用的技術。


2.RabbitMQ簡介

大多數應用中,都會通過消息服務的中間件來提升系統的異步通信和擴展解耦的能力。

RabbitMQ是一個由erlang開發的AMQP(Advanved Message Queue Protocol)的開源實現。它支持跨平臺和跨語言。


3.RabbitMQ的重要概念

1)Message

消息,它由消息頭和消息體組成。消息體是不透明的,而消息頭則由一系列的可選屬性組成,這些屬性包括routing-key(路由鍵)、priority(相對於其他消息的優先權)、delivery-mode(指出該消息可能需要持久性存儲)等。



2)Publisher

消息的生產者,也是一個向交換器發佈消息的客戶端應用程序。

3)Exchange

交換器,用來接收生產者發送的消息並將這些消息路由給服務器中的隊列。
Exchange有4種類型:
direct(默認),fanout, topic, 和headers,不同類型的Exchange轉發消息的策略有所區別

1.Direct Exchange


這是直接交換機的類型,如果消息中的路由鍵(routing-key)和bing(綁定在本文下面有講)中一致時,交換機就能將該消息發到對應的隊列中。它是一種完全匹配纔會發送的模式,可以構建點對點的消息傳輸模型。


2.Fanout Exchange

這是廣播式的交換類型,即發到Fanout類型交換機上的消息都會被分發到與之綁定的所有隊列上,它不處理路由鍵(不管路由鍵是什麼都會分發消息到綁定的隊列上)。Fanout類型轉發消息的速度是最快的。

注意:它不處理路由鍵,只要綁定的隊列都會收到Fanout交換機上轉發的消息。

          它不處理路由鍵,只要綁定的隊列都會收到Fanout交換機上轉發的消息。

          它不處理路由鍵,只要綁定的隊列都會收到Fanout交換機上轉發的消息。


3.Topic Exchange


主題交換機類型;Exchange會根據模式匹配來分配消息,根據綁定隊列的路由鍵和某個模式進行匹配,匹配成功就將消息發送到對應的隊列上。

它會識別兩個符號: * 和 # 。 * 代表的是匹配一個單詞。而#代表的是匹配0個或多個單詞

比如上圖中routingkey是usa.news的,交換機會根據模式匹配去匹配與之綁定的4個隊列;先看紅色隊列的bingding-key是usa.#,我們知道#號是匹配0個或者多個單詞,所以usa.news能夠與之匹配上,所以消息能夠分發到紅色的隊列中。

黃色隊列的bingding-key是#.news,所以也能夠匹配上routing-key,所以消息也能分發到該隊列中。

綠色的隊列binging-key是#.weather,#號能夠匹配多個,但是routing-key中並沒有weather,所以消息不用被分配到此隊列中。

藍色的隊列同理,就不再敘述了。


4.Header Exchange

這個是標題類型的交換機,這個用得比較少,個人瞭解也比較少。有興趣的讀者可自行查閱一下。

我這裏引用一下別人文章的介紹:https://blog.csdn.net/LeiXiaoTao_Java/article/details/78909760

介紹:同direct exchange類似,不同之處是不再使用Routing Key路由,而是使用headers(Message attributes)進行匹配路由到指定Queue。

header exchange也是忽略routingKey的一種路由方式。是使用Headers來匹配的。Headers是一個鍵值對,可以定義成HashTable。發送者在發送的時候定義一些鍵值對,接收者也可以再綁定時候傳入一些鍵值對,兩者匹配的話,則對應的隊列就可以收到消息。匹配有兩種方式all和any。這兩種方式是在接收端必須要用鍵值"x-mactch"來定義。all代表定義的多個鍵值對都要滿足,而any則代碼只要滿足一個就可以了。fanout,direct,topic exchange的routingKey都需要要字符串形式的,而headers exchange則沒有這個要求,因爲鍵值對的值可以是任何類型。


4)Queue

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


5)Binding

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


6)Connection

網絡連接,比如一個TCP連接。


7)Consumer

消息的消費者,表示一個從消息隊列中取得消息的客戶端應用程序。

8)Broker

表示消息隊列服務器實體


9)Channel

信道,多路複用連接中的一條獨立的雙向數據流通道。信道是建立在真實的TCP連接內的虛擬連接,AMQP (高級消息隊列協議)命令都是通過信道發出去的,不管是發佈消息、訂閱隊列還是接收消息,這些動作都是通過信道完成。因爲對於操作系統來說建立和銷燬 TCP 都是非常昂貴的開銷,所以引入了信道的概念,以複用一條 TCP 連接。


10)Virtual Host

虛擬主機,表示一批交換器、消息隊列和相關對象。虛擬主機是共享相同的身份認證和加密環境的獨立服務器域。每個 vhost 本質上就是一個 RabbitMQ 服務器,擁有自己的隊列、交換器、綁定和權限機制。vhost 是 AMQP  (高級消息隊列協議)概念的基礎,必須在連接時指定,RabbitMQ 默認的 vhost 是 / 。





參考:https://blog.csdn.net/LeiXiaoTao_Java/article/details/78909760

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章