RabbitMQ消息隊列(二)-RabbitMQ消息隊列架構與基本概念

RabbitMQ消息隊列(二)-RabbitMQ消息隊列架構與基本概念

沒錯我還是沒有講怎麼安裝和寫一個HelloWord,不過快了,這一章我們先了解下RabbitMQ的基本概念。

RabbitMQ架構

說是架構其實更像是應用場景下的架構(自己畫的有點醜,勿嫌棄)

RabbitMQ應用架構

從圖中可以看出RabbitMQ主要由Exchange和Queue兩部分組成,然後通過RoutingKey關聯起來,消息投遞到Exchange然後通過Queue接收。

RabbitMQ消息隊列基本概念

RabbitMQ Server: 也叫broker server,它是一種傳輸服務。 他的角色就是維護一條從Producer到Consumer的路線,保證數據能夠按照指定的方式進行傳輸。但是這個保證也不是100%的保證,但是對於普通的應用來說這已經足夠了。當然對於商業系統來說,可以再做一層數據一致性的guard,就可以徹底保證系統的一致性了。

Producer: 消息生產者,如圖A、B、C,數據的發送方。消息生產者連接RabbitMQ服務器然後將消息投遞到Exchange。

Consumer:消息消費者,如圖1、2、3,數據的接收方。消息消費者訂閱隊列,RabbitMQ將Queue中的消息發送到消息消費者。

Exchange:生產者將消息發送到Exchange(交換器),由Exchange將消息路由到一個或多個Queue中(或者丟棄)。Exchange並不存儲消息。RabbitMQ中的Exchange有fanout、direct、topic、headers四種類型,每種類型對應不同的路由規則,後面詳細介紹這四種類型。

Queue:(隊列)是RabbitMQ的內部對象,用於存儲消息。消息消費者就是通過訂閱隊列來獲取消息的,RabbitMQ中的消息都只能存儲在Queue中,生產者生產消息並最終投遞到Queue中,消費者可以從Queue中獲取消息並消費。多個消費者可以訂閱同一個Queue,這時Queue中的消息會被平均分攤給多個消費者進行處理,而不是每個消費者都收到所有的消息並處理。

RoutingKey:生產者在將消息發送給Exchange的時候,一般會指定一個routing key,來指定這個消息的路由規則,而這個routing key需要與Exchange Type及binding key聯合使用才能最終生效。在Exchange Type與binding key固定的情況下(在正常使用時一般這些內容都是固定配置好的),我們的生產者就可以在發送消息給Exchange時,通過指定routing key來決定消息流向哪裏。RabbitMQ爲routing key設定的長度限制爲255 bytes。

Connection: (連接)。Producer和Consumer都是通過TCP連接到RabbitMQ Server的。以後我們可以看到,程序的起始處就是建立這個TCP連接。

Channels: (信道)。它建立在上述的TCP連接中。數據流動都是在Channel中進行的。也就是說,一般情況是程序起始建立TCP連接,第二步就是建立這個Channel。

Exchange Types:

  • fanout

fanout類型的Exchange路由規則非常簡單,它會把所有發送到該Exchange的消息路由到所有與它綁定的Queue中。
生產者發送到Exchange的所有消息都會路由到綁定的Queue,並最終被兩個消費者消費。

  • direct

direct類型的Exchange路由規則也很簡單,它會把消息路由到那些binding key與routing key完全匹配的Queue中。(在實際使用RabbitMQ的過程中並沒有binding key這個參數,只有routing key,爲了區分我們把交換機和隊列綁定時傳的參數叫binding key,把發送消息時帶的這個參數叫routing key)

  • topic

前面講到direct類型的Exchange路由規則是完全匹配binding key與routing key,但這種嚴格的匹配方式在很多情況下不能滿足實際業務需求。topic類型的Exchange在匹配規則上進行了擴展,它與direct類型的Exchage相似,也是將消息路由到binding key與routing key相匹配的Queue中,但direct是完全匹配,而通過topic可以進行模糊匹配

routing key爲一個句點號“. ”分隔的字符串(我們將被句點號“. ”分隔開的每一段獨立的字符串稱爲一個單詞),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
binding key與routing key一樣也是句點號“. ”分隔的字符串
binding key中可以存在兩種特殊字符“”與“#”,用於做模糊匹配,其中“”用於匹配一個單詞,“#”用於匹配多個單詞(可以是零個)

  • headers

headers類型的Exchange不依賴於routing key與binding key的匹配規則來路由消息,而是根據發送的消息內容中的headers屬性進行匹配。
在綁定Queue與Exchange時指定一組鍵值對;當消息發送到Exchange時,RabbitMQ會取到該消息的headers(也是一個鍵值對的形式),對比其中的鍵值對是否完全匹配Queue與Exchange綁定時指定的鍵值對;如果完全匹配則消息會路由到該Queue,否則不會路由到該Queue。(實際中我並有用過)

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