前文我們學習了 MQ的相關知識,現在我們來學習一下實作了AMQP協定的
rabbitMQ
中間件。rabbitMQ 是使用 erlang 語言編寫的中間件(erlang之父 19年4月去世的,很偉大一個程式員)。
rabbitMQ 的結構和的角色
學習rabbtMQ我們先要弄清楚這幾個概念:
exchange
,
queue
,
routing-key
,
binding-key
,
message
,
publisher
,
exchange
,
binding-key
,
Connection
,
Channel
,
consumer
,
broker
;下面對這些角色概念進行介紹。
消息的發送方被稱作
publisher
(生産者),而消息的接收方被稱作
consumer
(消費者),而消息隊列伺服器實體就是
broker
(指
rabbitMQ
);消費者或者生産者對rabbitMQ的一個連接配接被稱作
Connection
(連接配接),在rabbit的連接配接模型中,為了提高連接配接傳輸效率,采用了
Channel
(管道)這種方式實作多路複用,類似于Nio中的模型;我們知道建立一個TCP連接配接代價很大,是以TCP連接配接建立後最好不要斷開
Connection
-
Channel
連接配接模型就是為了達到這種目的;一個消費者(生産者)使用一個
channel
消費(發送)消息,而多個
Channel
共用一個
Connection
。
一個生産者向rabbit投遞消息,然後消費者消費這個消息的過程是這樣的——生産者将消息投遞給rabbit,在rabbit中
exchange
(交換機)首先會接收到這個消息,交換機相當于一個“分揀員”的角色,負責分揀消息,将這些消息存儲到和自己綁定的
queue
(隊列)中去,然後和隊列綁定的消費者會消費這些消息。隊列和交換機綁定通過一個
binding-key
(綁定鍵)來标記,而生産者投遞消息給交換機的時候會指定一個
routing-key
(路由鍵),而交換機會根據路由和綁定鍵來判斷将消息放到那些隊列中去(擴充:kafka的資料是存儲在 exchange 中,它的 queue 隻是邏輯隊列)。
圖一是rabbitMQ的一個概念簡圖:
圖一:rabbitMQ 概念簡圖
rabbitMQ交換機類型
在rabbit中交換機共有四種類型,下面對其類型和其消息路由規則做說明:
-
(直連交換機):消息中的direct exchange
如果和routing-key
一緻, 交換器就将消息發到對應的隊列中,binding-key
要與routing-key
完全比對。binding-key
-
(扇型交換機):扇型交換機會将交給自己的消息發到所有和自己綁定的隊列中去,它不會去比對fanout exchange
和routing-key
。binding-key
-
(主題交換機):主題交換機的topic exchange
比對routing-key
的方式支援模糊比對, 以.分割單詞,binding-key
比對一個單詞,*
比對多個單詞,比如如路由鍵是#
能被com.muggle.first
和com.#
綁定鍵比對。*.muggle.*
-
(頭交換機):類似主題交換機,但是頭交換機使用多個消息屬性來代替路由鍵建立路由規則。通過判斷消息頭的值能否與指定的綁定相比對來确立路由規則。當交換機的headers exchange
屬性為x-match
時,消息頭的任意一個值被比對就可以滿足條件,當為any
的時候,就需要消息頭的所有值都比對成功,這種交換機在實際生産中用的并不多。all
在實際生産中,我們可以選擇不同交換機類型來靈活的配置我們的生産者和消費者之間消息的消費關系。如延時隊列,消息廣播等的功能。
作者:muggle 點我關注作者
出處:https://muggle-book.gitee.io/
版權:本文版權歸作者所有
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接配接;否則必究法律責任
點選關注我的部落格