RabbitMQ Exchange Queue RoutingKey BindingKey解析

字號+ 編輯: 国内TP粉 修訂: 面向ICU 來源: xinbaobaoer 2023-09-08 我要說兩句(0)

RabbitMQ初學者專用。

許多新手在剛接觸RabbitMQ的時候,會被各種名詞弄暈,包括ConnectionFactory 、Connection 、Channel、Exchange、Queue、RoutingKey、BindingKey等等,現在我簡單描述一下這些名詞到底是啥概念。

首先我們肯定知道RabbitMQ就是消息隊列的一種實現,那麽圍繞這個,我們就可以思考一個消息隊列到底需要什麽,當然是需要隊列,那麽這個隊列就是Queue,那麽其他的所有名詞都是圍繞這個Queue來拓展的。

首先,想要讓隊列不在本地運行,而在網路中運行,肯定會有連接這個概念,所以就會有Connection,我們發一條消息連接一次,這樣很顯然是浪費資源的,建立連接的過程也很耗時,所以我們就會做一個東西讓他來管理連接,當我用的時候,直接從裡邊拿出來已經建立好的連接發信息,那麽ConnectionFactory應運而生。

接下來,當程序開發時,可能不止用到一個隊列,可能有訂單的隊列、消息的隊列、任務的隊列等等,那麽就需要給不同的queue發信息,那麽和每一個隊列連接的這個概念,就叫Channel

再往下來,當我們開發的時候還有時候會用到這樣一種功能,就是當我發送一條消息,需要讓幾個queue都收到,那麽怎麽解決這個問題呢,難道我要給每一個queue發送一次消息?那豈不是浪費帶寬又浪費資源,我們能想到什麽辦法呢,當然是我們發送給RabbitMQ服務器一次,然後讓RabbitMQ服務器自己解析需要給哪個Queue發,那麽Exchange就是干這件事的

但是我們給Exchange發消息,他怎麽知道給哪個Queue發呢?這裡就用到了RoutingKeyBindingKey

BindingKey是Exchange和Queue綁定的槼則描述,這個描述用來解析當Exchange接收到消息時,Exchange接收到的消息會帶有RoutingKey這個字段,Exchange就是根據這個RoutingKey和當前Exchange所有綁定的BindingKey做匹配,如果滿足要求,就往BindingKey所綁定的Queue發送消息,這樣我們就解決了我們向RabbitMQ發送一次消息,可以分發到不同的Queue的過程

至此,我們就把所有的名詞貫通咯,接下來做個概要描述:

  • ConnectionFactory:與RabbitMQ服務器連接的管理器

  • Connection:與RabbitMQ服務器的連接

  • Channel:客戶耑與Exchange的連接通道,所有讀寫操作都在這裡完成

  • Exchange:接受消息提供者(生産者)的消息,並根據消息的RoutingKey和Exchange綁定的BindingKey分配消息

  • Queue:存儲消息接收者(消費者)的消息

  • RoutingKey:指定當前消息被誰接受

  • BindingKey:指定當前Exchange下,什麽樣的RoutingKey會被下派到當前綁定的Queue中

如下圖(本人畫畫功底薄,別見怪~)

截屏2021-04-01 下午2.05.38.jpg

其中我們看到BindingKey1有兩個,這樣不會沖突,因爲消息具體發送到哪裡是通過Exchange和RoutingKey來決定的

也就是說我指定Channel1-->Exchange1-->BindingKey1就會被發送到Queue1中

當我指定Channel-2-->Exchange2-->bindingKey1則會發送到Queue2和Queue3中

溫馨提示:當前的RoutingKey和BindingKey均爲參數名稱,不是參數真實值,那麽真實情況下是下方這樣的:

創建ConnectionFactory,通過ConnectionFactory創建Connection,通過Connection創建Channel

通過channel,聲明一個Exchange名字爲“Exchange2”,聲明一個Queue名字爲“Queue2”,聲明一個Queue名字爲“Queue3”

聲明完了,我們就需要讓他們綁定了,讓“Exchange2”綁定到“Queue2”上,設置綁定的RoutingKey(真實情況下參數名都是RoutingKey,沒有BindingKey這個參數,爲了區別用戶發送的和我們綁定的概念,我們才說RoutingKey和BindingKey)爲“key1”,在讓“Exchange2”綁定到“Queue2”上,設置綁定的RoutingKey爲“key1”,然後通過Channel發送消息,發送消息的三個參數Exchange名稱、RoutingKey,和消息,Exchange名稱就是“Exchange2”,RoutingKey就是“key1”,那麽這樣這條消息就會被成功發送到“Queue2”和“Queue3”中了,OK大功告成!

閲完此文,您的感想如何?
  • 有用

    3

  • 沒用

    3

  • 開心

    2

  • 憤怒

    1

  • 可憐

    1

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • 防止退出linux終耑退出之後導致的nohup進程強制退出

  • Linux系統下word文档轉成pdf的辦法

  • ubuntu和debian安裝nginx或者tengine報錯, 找不到pcre依賴庫的解決辦法

  • 常見的web中間件請求返回狀態碼

我要說說
網上賓友點評