(一) RabbitMQ實戰教程(面向Java開發人員)之RabbitMQ相關概念介紹
前言
因為專案組需要對RabbitMQ的使用進行優化,所以系統化的學習了RabbitMQ,寫下本系列部落格的目的是希望能幫助到後續使用RabbitMQ的同學少走彎路,在閱讀本部落格前我希望您已經對RabbitMQ有基本的瞭解。本篇部落格主要面向JAVA開發人員,因此不會涉及到運維相關知識,該系列部落格大致分為如下幾個模組
1.RabbitMQ相關概念介紹
2.RabbitMQ Java Client使用
3.使用Spring AMQP整合RabbitMQ
4.使用@RabbitListener註解進行訊息消費
5.RabbitMQ的異常處理
6.RabbitMQ訊息可靠性保障
7.RabbitMQ 的常用屬性介紹
8.使用RabbitMQ進行非同步RPC通訊
9.使用SpringBoot整合RabbitMQ
概念介紹
RabbitMQ的主要流程:生產者將訊息傳送到交換機,交換機根據不同路由規則將訊息路由到已經繫結到該交換機且符合路由規則的佇列中去,消費者通過監聽佇列來獲取訊息。注:交換機不儲存訊息,預設情況下訊息如果沒有被正確路由到相應佇列,該訊息將會被丟棄
訊息
訊息是伺服器與應用程式之間傳送的資料,由Properties和Payload(Body)組成,Message具有如下屬性
屬性名 | 屬性描述 |
---|---|
Routing key | Routing key |
Delivery mode | 是否持久化 Persistent持久化 Non-persistent不持久化 |
Headers | 頭資訊,是由一個或多個鍵值對組成的,是AMQP協議留給AMQP實現做擴充套件使用的 |
Properties | AMQP提供的部分屬性 |
Payload | 訊息體 |
佇列
佇列是訊息的載體,每個訊息都應該被投入一個或多個佇列,Queue具有如下屬性
屬性名 | 屬性描述 |
---|---|
Virtual host | 虛擬主機 |
Name | 佇列名稱,同一個Virtual host下不能有相同的Name |
Durability | 是否持久化,Durable:是 Transient:否 |
Auto delete | 如果該佇列沒有任何訂閱的消費者的話,該佇列會被自動刪除 |
Arguments | 引數,是AMQP協議留給AMQP實現做擴充套件使用的 |
繫結
RabbitMQ中的繫結通常是指交換機與佇列的繫結關係(交換機與交換機繫結極少使用),Binding有如下屬性
屬性名 | 屬性描述 |
---|---|
To queue / To exchange | 佇列名稱 / 交換機名稱 |
Routing key | Routing key |
Arguments | 路由引數(只有Headers Exchange是根據引數路由的,故只有Headers Exchange需要設定該引數) |
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種交換機:[直連交換機、扇形交換機、主題交換機、首部交換機],交換機有如下屬性:
屬性名 | 屬性描述 |
---|---|
Virtual host | 虛擬主機 |
Name | 交換機名稱,同一個Virtual host下不能有相同的Name |
Type | 交換機型別 |
Durability | 是否持久化,Durable:是 Transient:否 |
Auto delete | 當最後一個繫結被刪除後,該交換機將被刪除 |
Internal | 是否是內部專用exchange,是的話就意味著我們不能往exchange裡面傳送訊息 |
Arguments | 引數,是AMQP協議留給AMQP實現做擴充套件使用的 |
RabbitMQ內建一個名稱為空字串的預設交換機,它根據Routing key將訊息路由到與佇列名與Routing key完全相等的佇列中
扇形交換機
扇形交換機(Fanout Exchange)會把能接受到的訊息全部發送給繫結到自己身上的佇列,扇形交換機在路由轉發的時候忽略Routing Key。因為廣播不需要思考所以扇形交換機處理訊息的速度是所有交換機型別裡面最快的
直連交換機
直連交換機(Direct Exchange)是一種帶路由功能的交換機,它將訊息中的Routing key與該交換機關聯的所有Binding中的Routing key進行比較,如果完全相等則將訊息傳送到Binding對應的佇列中,適用場景:根據任務的優先順序把訊息傳送到對應的佇列中,分配更多資源處理優先順序高的佇列
主題交換機
主題交換機(Topic Exchange)與直連交換機相比主題交換機的Routing key支援萬用字元,它將訊息中的Routing key與該交換機關聯的所有Binding中的Routing key進行比較,如果匹配上對應的匹配規則則將訊息傳送到Binding對應的佇列中
*:匹配一個單詞
#:匹配0個或多個單詞
如果Binding中的Routing key不包含*,#,則表示相等轉發,類似於Direct Exchange
如果Binding中的Routing key為#或者#.#,則表示全部轉發,類似於Fanout Exchange
首部交換機
首部交換機(Headers Exchange)[不常用 瞭解即可]在進行路由轉發的時候會忽略Routing Key,它將訊息中的Headers與該交換機關聯的所有Binding中的引數進行匹配,如果匹配上則將訊息傳送到Binding對應的佇列中。它的匹配規則有下列兩種型別
匹配規則
x-match = any則表示只要有鍵值對匹配就能轉發訊息
x-match = all則表示所有的鍵值對都匹配才能轉發訊息
注:Binding的時候至少需要指定兩個引數,其中一個是x-match = all/any
由於本系列部落格篇幅有限,所以不會對四種交換機的使用進行詳細的擴充套件,只是點到為止