RabbitMQ的使用(四)相關概念介紹
概念介紹
RabbitMQ是實現了高階訊息佇列協議(AMQP)的開源訊息代理軟體(亦稱面向訊息的中介軟體)。RabbitMQ伺服器是用Erlang語言編寫的,而群集和故障轉移是構建在開放電信平臺框架上的。所有主要的程式語言均有與代理介面通訊的客戶端庫。
簡單介紹:RabbitMQ
是一個訊息代理軟體,它可以接受和轉發訊息。你可以把它想象成是一個郵局,當你傳送訊息到交換機(郵局),交換機會根據routing key找到對應的佇列(快遞員)消費者消費訊息,與以上不同的是RabbitMQ
使用二進位制的形式進行資料的接收、儲存、轉發。用專業術語解釋下這個接收、儲存、轉發。
RabbitMQ的主要流程:生產者將訊息傳送到交換機,交換機根據不同路由規則將訊息路由到已經繫結到該交換機且符合路由規則的佇列中去,消費者通過監聽佇列來獲取訊息。注:交換機不儲存訊息,預設情況下訊息如果沒有被正確路由到相應佇列,該訊息將會被丟棄
佇列
佇列是訊息的載體,每個訊息都應該被投入一個或多個佇列,Queue具有如下屬性
屬性名 | 屬性描述 |
---|---|
Virtual host | 虛擬主機 |
Name | 佇列名稱,同一個Virtual host下不能有相同的Name |
Durability | 是否持久化,Durable:是 Transient:否 |
Auto delete | 如果該佇列沒有任何訂閱的消費者的話,該佇列會被自動刪除 |
Arguments | 引數,是AMQP協議留給AMQP實現做擴充套件使用的 |
繫結
RabbitMQ中的繫結通常是指交換機與佇列的繫結關係(交換機與交換機繫結極少使用),Binding有如下屬性
Default Exchange不能進行Binding也不需要進行Binding
除了Default Exchange之外其他任何Exchange都需要和Queue進行Binding,否則無法進行訊息路由
Direct Exchange、Topic Exchange進行Binding的時候需要指定Routing key
Fanout Exchange、Headers Exchange進行Binding的時候不需要指定Routing key
交換機
交換機的作用是接收生產者的訊息,並將訊息路由到已經繫結到該交換機且符合路由規則的佇列中去。RabbitMQ定義瞭如下4種交換機:[直連交換機、扇形交換機、主題交換機、首部交換機],交換機有如下屬性:
RabbitMQ內建一個名稱為空字串的預設交換機,它根據Routing key將訊息路由到與佇列名與Routing key完全相等的佇列中
屬性名 | 屬性描述 |
---|---|
Virtual host | 虛擬主機 |
Name | 交換機名稱,同一個Virtual host下不能有相同的Name |
Type | 交換機型別 |
Durability | 是否持久化,Durable:是 Transient:否 |
Auto delete | 當最後一個繫結被刪除後,該交換機將被刪除 |
Internal | 是否是內部專用exchange,是的話就意味著我們不能往exchange裡面傳送訊息 |
Arguments | 引數,是AMQP協議留給AMQP實現做擴充套件使用的 |
扇形交換機
扇形交換機是最基本的交換機型別,它所能做的事情非常簡單———廣播訊息。扇形交換機會把能接收到的訊息全部發送給繫結在自己身上的佇列。因為廣播不需要“思考”,所以扇形交換機處理訊息的速度也是所有的交換機型別裡面最快的。
直連交換機
直連交換機是一種帶路由功能的交換機,一個佇列會和一個交換機繫結,除此之外再繫結一個routing_key
,當訊息被髮送的時候,需要指定一個binding_key
,這個訊息被送達交換機的時候,就會被這個交換機送到指定的佇列裡面去。同樣的一個binding_key
也是支援應用到多個佇列中的。
這樣當一個交換機繫結多個佇列,就會被送到對應的佇列去處理。
適用場景:有優先順序的任務,根據任務的優先順序把訊息傳送到對應的佇列,這樣可以指派更多的資源去處理高優先順序的佇列。
主題交換機
直連交換機的routing_key
方案非常簡單,如果我們希望一條訊息傳送給多個佇列,那麼這個交換機需要繫結上非常多的routing_key
,假設每個交換機上都繫結一堆的routing_key
連線到各個佇列上。那麼訊息的管理就會異常地困難。
所以RabbitMQ
提供了一種主題交換機,傳送到主題交換機上的訊息需要攜帶指定規則的routing_key
,主題交換機會根據這個規則將資料傳送到對應的(多個)佇列上。
主題交換機的routing_key
需要有一定的規則,交換機和佇列的binding_key
需要採用*.#.*.....
的格式,每個部分用.
分開,其中:
*
表示一個單詞#
表示任意數量(零個或多個)單詞。
假設有一條訊息的routing_key
為fast.rabbit.white
,那麼帶有這樣binding_key
的幾個佇列都會接收這條訊息:
- fast..
- ..white
- fast.#
- ……
當一個佇列的繫結鍵為#
的時候,這個佇列將會無視訊息的路由鍵,接收所有的訊息。
首部交換機
首部交換機是忽略routing_key
的一種路由方式。路由器和交換機路由的規則是通過Headers
資訊來交換的,這個有點像HTTP
的Headers
。將一個交換機宣告成首部交換機,繫結一個佇列的時候,定義一個Hash
的資料結構,訊息傳送的時候,會攜帶一組hash資料結構的資訊,當Hash
的內容匹配上的時候,訊息就會被寫入佇列。
繫結交換機和佇列的時候,Hash結構中要求攜帶一個鍵“x-match”,這個鍵的Value
可以是any
或者all
,這代表訊息攜帶的Hash
是需要全部匹配(all),還是僅匹配一個鍵(any)就可以了。相比直連交換機,首部交換機的優勢是匹配的規則不被限定為字串(string)。
它的匹配規則有下列兩種型別
匹配規則
x-match = any則表示只要有鍵值對匹配就能轉發訊息
x-match = all則表示所有的鍵值對都匹配才能轉發訊息
注:Binding的時候至少需要指定兩個引數,其中一個是x-match = all/any