Rabbitmq交換機(jī)(Exchange)類型

其中有個(gè)默認(rèn)的交換機(jī),如果生產(chǎn)者的 exchange 交換機(jī), 不設(shè)置交換機(jī)就輸入空字符串, 就表示走第一個(gè)默認(rèn)的交換機(jī)(AMQP default), 也就是說(shuō) routingKet 會(huì)和交換機(jī)綁定一起,那么就表示都走這個(gè)默認(rèn)的交換機(jī)!

最新版本的RabbitMQ有四種交換機(jī)類型,分別是Direct exchange、Fanout exchange、Topic exchange、Headers exchange。

Direct Exchange

處理路由鍵。需要將一個(gè)隊(duì)列綁定到交換機(jī)上,要求該消息與一個(gè)特定的路由鍵完全匹配。這是一個(gè)完整的匹配。如果一個(gè)隊(duì)列綁定到該交換機(jī)上要求路由鍵 “abc”,則只有被標(biāo)記為“abc”的消息才被轉(zhuǎn)發(fā),不會(huì)轉(zhuǎn)發(fā)abc.def,也不會(huì)轉(zhuǎn)發(fā)dog.ghi,只會(huì)轉(zhuǎn)發(fā)abc。

image.png

Fanout Exchange

不處理路由鍵。你只需要簡(jiǎn)單的將隊(duì)列綁定到交換機(jī)上。一個(gè)發(fā)送到交換機(jī)的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊(duì)列上。很像子網(wǎng)廣播,每臺(tái)子網(wǎng)內(nèi)的主機(jī)都獲得了一份復(fù)制的消息。Fanout交換機(jī)轉(zhuǎn)發(fā)消息是最快的。

image.png

Topic Exchange

將路由鍵和某模式進(jìn)行匹配。此時(shí)隊(duì)列需要綁定要一個(gè)模式上。符號(hào)“#”匹配一個(gè)或多個(gè)詞,符號(hào)“”匹配不多不少一個(gè)詞。因此“abc.#”能夠匹配到“abc.def.ghi”,但是“abc.” 只會(huì)匹配到“abc.def”。

image.png

Headers Exchanges

不處理路由鍵。而是根據(jù)發(fā)送的消息內(nèi)容中的headers屬性進(jìn)行匹配。在綁定Queue與Exchange時(shí)指定一組鍵值對(duì);當(dāng)消息發(fā)送到RabbitMQ時(shí)會(huì)取到該消息的headers與Exchange綁定時(shí)指定的鍵值對(duì)進(jìn)行匹配;如果完全匹配則消息會(huì)路由到該隊(duì)列,否則不會(huì)路由到該隊(duì)列。headers屬性是一個(gè)鍵值對(duì),可以是Hashtable,鍵值對(duì)的值可以是任何類型。而fanout,direct,topic 的路由鍵都需要要字符串形式的。

匹配規(guī)則x-match有下列兩種類型:

x-match = all :表示所有的鍵值對(duì)都匹配才能接受到消息

x-match = any :表示只要有鍵值對(duì)匹配就能接受到消息

交換機(jī)和交換機(jī)類型

交換機(jī)是用來(lái)發(fā)送消息的AMQP實(shí)體。交換機(jī)拿到一個(gè)消息之后將它路由給一個(gè)或零個(gè)隊(duì)列。它使用哪種路由算法是由交換機(jī)類型和被稱作綁定(bindings)的規(guī)則所決定的。AMQP 0-9-1的代理提供了四種交換機(jī)

Name(交換機(jī)類型) Default pre-declared names(預(yù)聲明的默認(rèn)名稱)
Direct exchange(直連交換機(jī)) (Empty string) and amq.direct
Fanout exchange(扇型交換機(jī)) amq.fanout
Topic exchange(主題交換機(jī)) amq.topic
Headers exchange(頭交換機(jī)) amq.match (and amq.headers in RabbitMQ)

除交換機(jī)類型外,在聲明交換機(jī)時(shí)還可以附帶許多其他的屬性,其中最重要的幾個(gè)分別是:

  • Name
  • Durability (消息代理重啟后,交換機(jī)是否還存在)
  • Auto-delete (當(dāng)所有與之綁定的消息隊(duì)列都完成了對(duì)此交換機(jī)的使用后,刪掉它)
  • Arguments(依賴代理本身)

交換機(jī)可以有兩個(gè)狀態(tài):持久(durable)、暫存(transient)。持久化的交換機(jī)會(huì)在消息代理(broker)重啟后依舊存在,而暫存的交換機(jī)則不會(huì)(它們需要在代理再次上線后重新被聲明)。然而并不是所有的應(yīng)用場(chǎng)景都需要持久化的交換機(jī)。

默認(rèn)交換機(jī)

默認(rèn)交換機(jī)(default exchange)實(shí)際上是一個(gè)由消息代理預(yù)先聲明好的沒有名字(名字為空字符串)的直連交換機(jī)(direct exchange)。它有一個(gè)特殊的屬性使得它對(duì)于簡(jiǎn)單應(yīng)用特別有用處:那就是每個(gè)新建隊(duì)列(queue)都會(huì)自動(dòng)綁定到默認(rèn)交換機(jī)上,綁定的路由鍵(routing key)名稱與隊(duì)列名稱相同。

舉個(gè)栗子:當(dāng)你聲明了一個(gè)名為"search-indexing-online"的隊(duì)列,AMQP代理會(huì)自動(dòng)將其綁定到默認(rèn)交換機(jī)上,綁定(binding)的路由鍵名稱也是為"search-indexing-online"。因此,當(dāng)攜帶著名為"search-indexing-online"的路由鍵的消息被發(fā)送到默認(rèn)交換機(jī)的時(shí)候,此消息會(huì)被默認(rèn)交換機(jī)路由至名為"search-indexing-online"的隊(duì)列中。換句話說(shuō),默認(rèn)交換機(jī)看起來(lái)貌似能夠直接將消息投遞給隊(duì)列,盡管技術(shù)上并沒有做相關(guān)的操作。

直連交換機(jī)

直連型交換機(jī)(direct exchange)是根據(jù)消息攜帶的路由鍵(routing key)將消息投遞給對(duì)應(yīng)隊(duì)列的。直連交換機(jī)用來(lái)處理消息的單播路由(unicast routing)(盡管它也可以處理多播路由)。下邊介紹它是如何工作的:

  • 將一個(gè)隊(duì)列綁定到某個(gè)交換機(jī)上,同時(shí)賦予該綁定一個(gè)路由鍵(routing key)
  • 當(dāng)一個(gè)攜帶著路由鍵為R的消息被發(fā)送給直連交換機(jī)時(shí),交換機(jī)會(huì)把它路由給綁定值同樣為R的隊(duì)列。

直連交換機(jī)經(jīng)常用來(lái)循環(huán)分發(fā)任務(wù)給多個(gè)工作者(workers)。當(dāng)這樣做的時(shí)候,我們需要明白一點(diǎn),在AMQP 0-9-1中,消息的負(fù)載均衡是發(fā)生在消費(fèi)者(consumer)之間的,而不是隊(duì)列(queue)之間。

直連型交換機(jī)圖例:


image.png

扇型交換機(jī)

扇型交換機(jī)(funout exchange)將消息路由給綁定到它身上的所有隊(duì)列,而不理會(huì)綁定的路由鍵。如果N個(gè)隊(duì)列綁定到某個(gè)扇型交換機(jī)上,當(dāng)有消息發(fā)送給此扇型交換機(jī)時(shí),交換機(jī)會(huì)將消息的拷貝分別發(fā)送給這所有的N個(gè)隊(duì)列。扇型用來(lái)交換機(jī)處理消息的廣播路由(broadcast routing)。

因?yàn)樯刃徒粨Q機(jī)投遞消息的拷貝到所有綁定到它的隊(duì)列,所以他的應(yīng)用案例都極其相似:

  • 大規(guī)模多用戶在線(MMO)游戲可以使用它來(lái)處理排行榜更新等全局事件
  • 體育新聞網(wǎng)站可以用它來(lái)近乎實(shí)時(shí)地將比分更新分發(fā)給移動(dòng)客戶端
  • 分發(fā)系統(tǒng)使用它來(lái)廣播各種狀態(tài)和配置更新
  • 在群聊的時(shí)候,它被用來(lái)分發(fā)消息給參與群聊的用戶。(AMQP沒有內(nèi)置presence的概念,因此XMPP可能會(huì)是個(gè)更好的選擇)

扇型交換機(jī)圖例:


image.png

主題交換機(jī)

主題交換機(jī)(topic exchanges)通過(guò)對(duì)消息的路由鍵和隊(duì)列到交換機(jī)的綁定模式之間的匹配,將消息路由給一個(gè)或多個(gè)隊(duì)列。主題交換機(jī)經(jīng)常用來(lái)實(shí)現(xiàn)各種分發(fā)/訂閱模式及其變種。主題交換機(jī)通常用來(lái)實(shí)現(xiàn)消息的多播路由(multicast routing)。

主題交換機(jī)擁有非常廣泛的用戶案例。無(wú)論何時(shí),當(dāng)一個(gè)問題涉及到那些想要有針對(duì)性的選擇需要接收消息的 多消費(fèi)者/多應(yīng)用(multiple consumers/applications) 的時(shí)候,主題交換機(jī)都可以被列入考慮范圍。

使用案例:

  • 分發(fā)有關(guān)于特定地理位置的數(shù)據(jù),例如銷售點(diǎn)
  • 由多個(gè)工作者(workers)完成的后臺(tái)任務(wù),每個(gè)工作者負(fù)責(zé)處理某些特定的任務(wù)
  • 股票價(jià)格更新(以及其他類型的金融數(shù)據(jù)更新)
  • 涉及到分類或者標(biāo)簽的新聞更新(例如,針對(duì)特定的運(yùn)動(dòng)項(xiàng)目或者隊(duì)伍)
  • 云端的不同種類服務(wù)的協(xié)調(diào)
  • 分布式架構(gòu)/基于系統(tǒng)的軟件封裝,其中每個(gè)構(gòu)建者僅能處理一個(gè)特定的架構(gòu)或者系統(tǒng)。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容