一RabbitMQ Exchange類型
RabbitMQ常用的交換器類型有: fanout、 direct、 topic、 headers四種。
1.1.Fanout
會(huì)把所有發(fā)送到該交換器的消息路由到所有與該交換器綁定的隊(duì)列中
如圖:
1.2.Direct
direct類型的交換器路由規(guī)則很簡單,它會(huì)把消息路由到那些BindingKey和RoutingKey完全匹配的 隊(duì)列中,如下圖:
1.3.Topic
topic類型的交換器在direct匹配規(guī)則上進(jìn)行了擴(kuò)展,也是將消息路由到BindingKey和RoutingKey 相匹配的隊(duì)列中,這里的匹配規(guī)則稍微不同,它約定:
- BindingKey和RoutingKey一樣都是由
.
分隔的字符串; - BindingKey中可以存在兩種特殊字符
*
和#
,用于模糊匹配,其中*
用于匹配一個(gè)單詞,#
用于匹配多個(gè)單詞(可以是0個(gè))。
1.4.Headers
headers類型的交換器不依賴于路由鍵的匹配規(guī)則來路由信息,而是根據(jù)發(fā)送的消息內(nèi)容中的 headers屬性進(jìn)行匹配。在綁定隊(duì)列和交換器時(shí)指定一組鍵值對(duì),當(dāng)發(fā)送的消息到交換器時(shí), RabbitMQ會(huì)獲取到該消息的headers,對(duì)比其中的鍵值對(duì)是否完全匹配隊(duì)列和交換器綁定時(shí)指定的鍵值對(duì),如果匹配,消息就會(huì)路由到該隊(duì)列。headers類型的交換器性能很差,不實(shí)用。
二 RabbitMQ 工作模式介紹
2.1.work工作模式(資源的競爭)
生產(chǎn)者發(fā)消息,啟動(dòng)多個(gè)消費(fèi)者實(shí)例來消費(fèi)消息,每個(gè)消費(fèi)者僅消費(fèi)部分信息,可達(dá)到負(fù)載均衡的效果。
1.消息產(chǎn)生者將消息放入隊(duì)列消費(fèi)者可以有多個(gè),消費(fèi)者1,消費(fèi)者2同時(shí)監(jiān)聽同一 個(gè)隊(duì)列,消息被消費(fèi)。C1 C2共同爭搶當(dāng)前的消息隊(duì)列內(nèi)容,誰先拿到誰負(fù)責(zé)消費(fèi)消息(隱患:高并發(fā)情況下,默認(rèn)會(huì)產(chǎn)生某一個(gè)消息被多個(gè)消費(fèi)者共同使用,可以設(shè)置一個(gè)開關(guān)(syncronize) 保證一條消息只能被一個(gè)消費(fèi)者使用)。
2.2.publish/subscribe發(fā)布訂閱(共享資源)
使用fanout類型交換器,routingKey忽略。每個(gè)消費(fèi)者定義生成一個(gè)隊(duì)列并綁定到同一個(gè) Exchange,每個(gè)消費(fèi)者都可以消費(fèi)到完整的消息。
1、每個(gè)消費(fèi)者監(jiān)聽自己的隊(duì)列
2、生產(chǎn)者將消息發(fā)給broker,由交換機(jī)將消息轉(zhuǎn)發(fā)到綁定此交換機(jī)的每個(gè)隊(duì)列,每個(gè)綁定交換機(jī)的隊(duì)列都將接收到消息。
2.3.routing路由模式
使用 direct類型的Exchange,發(fā)N條消費(fèi)并使用不同的 routingKey,消費(fèi)者定義隊(duì)列并將隊(duì)列、 routingKey、Exchange綁定。此時(shí)使用 direct模式Exchagne必須要 routingKey完全匹配的 情況下消息才會(huì)轉(zhuǎn)發(fā)到對(duì)應(yīng)的隊(duì)列中被消費(fèi)。
上一個(gè)模式中,可以將消息廣播到很多接收者。 現(xiàn)在我們想讓接收者只接收部分消息,如,我們通過直接模式的交換器將關(guān)鍵的錯(cuò)誤信息記錄到 log文件,同時(shí)在控制臺(tái)正常打印所有的日志信息。
應(yīng)用–direct交換器
分布式系統(tǒng)中有很多應(yīng)用,這些應(yīng)用需要運(yùn)維平臺(tái)的監(jiān)控,其中一個(gè)重要的信息就是服務(wù)器的日志 記錄。
我們需要將不同日志級(jí)別的日志記錄交給不同的應(yīng)用處理。 如何解決?
使用direct交換器
如果要對(duì)不同的消息做不同的處理,此時(shí)不能使用 fanout類型的交換器,因?yàn)樗粫?huì)盲目的廣播消息。 我們需要使用 direct類型的交換器。 direct交換器的路由算法很簡單:只要消息的 routingKey和隊(duì)列的 bindingKey對(duì)應(yīng),消息就可以推送給該隊(duì)列。
上圖中的交換器 X是 direct類型的交換器,綁定的兩個(gè)隊(duì)列中,一個(gè)隊(duì)列的 bindingKey是 orange,另一個(gè)隊(duì)列的 bindingKey是 black和 green。 如此,則 routingKey是 orange的消息發(fā)送給隊(duì)列Q1, routingKey是 black和 green的消息發(fā) 送給Q2隊(duì)列,其他消息丟棄。
2.4.topic 主題模式(路由模式的一種)
使用 topic類型的交換器,隊(duì)列綁定到交換器、 bindingKey時(shí)使用通配符,交換器將消息路由轉(zhuǎn) 發(fā)到具體隊(duì)列時(shí)會(huì)根據(jù)消息 routingKey模糊匹配,比較靈活。
上個(gè)模式中,我們通過 direct類型的交換器做到了根據(jù)日志級(jí)別的不同,將消息發(fā)送給了不同隊(duì)列的。 這里有一個(gè)限制,現(xiàn)在我不僅想根據(jù)日志級(jí)別劃分日志消息,還想根據(jù)日志來源劃分日志,怎 么做?
比如,我想監(jiān)聽cron服務(wù)發(fā)送的 error消息,又想監(jiān)聽從kern服務(wù)發(fā)送的所有消息。 此時(shí)可以使用RabbitMQ的主題模式( Topic)。
要想 topic類型的交換器, routingKey就不能隨便寫了,它必須得是點(diǎn)分單詞。單詞可以隨便寫,生產(chǎn)中一般使用消息的特征。如:“stock.usd.nyse”,“nyse.vmw”,“quick.orange.rabbit”等。該點(diǎn)分單詞字符串最長255字節(jié)。 bindingKey也必須是這種形式。 topic類型的交換器背后原理跟 direct類型的類似:只要隊(duì)列 的 bindingKey的值與消息的 routingKey匹配,隊(duì)列就可以收到該消息。有兩個(gè)不同:
- *(star)匹配一個(gè)單詞
- #匹配0到多個(gè)單詞
上圖中,我們發(fā)送描述動(dòng)物的消息。消息發(fā)送的時(shí)候指定的 routingKey包含了三個(gè)詞,兩個(gè)點(diǎn)。 第一個(gè)單詞表示動(dòng)物的速度,第二個(gè)是顏色,第三個(gè)是物種:..。
創(chuàng)建三個(gè)綁定:
Q1綁定到*.orange.*
Q2綁定到 *.*.rabbit
和 lazy.#
。
-
Q1關(guān)注orange顏色動(dòng)物的消息
-
Q2關(guān)注兔子的消息,以及所有懶的動(dòng)物消息文章來源:http://www.zghlxwxcb.cn/news/detail-500351.html
如果不能匹配,就丟棄消息。
如果發(fā)送的消息 routingKey是" lazy.orange.male.rabbit",則會(huì)匹配最后一個(gè)綁定。
如果在 topic類型的交換器中 bindingKey使用 #,則就是 fanout類型交換器的行為。
如果在 topic類型的交換器中 bindingKey中不使用 *和 #,則就是 direct類型交換器的行為文章來源地址http://www.zghlxwxcb.cn/news/detail-500351.html
到了這里,關(guān)于RabbitMQ Exchange類型和工作模式介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!