1.簡(jiǎn)介

上一章介紹了direct類(lèi)型的exchange,并用它實(shí)現(xiàn)了一個(gè)偽廣播(Queue綁定多個(gè)routingKey)日志系統(tǒng),現(xiàn)在,考慮另一個(gè)問(wèn)題,我們的日志系統(tǒng)不僅要分級(jí)別級(jí)別(error,info)記錄日志,還需要通過(guò)發(fā)送日志的系統(tǒng)來(lái)匹配,比如說(shuō)有一個(gè)“核心”系統(tǒng),它發(fā)出的所有級(jí)別日志,都需要記錄到硬盤(pán),其他系統(tǒng)只需要把error級(jí)別的日志記錄到硬盤(pán)。

如果用上一章的direct該怎么做呢?

  • 給routingKey分層,變成類(lèi)似這樣的字符串:核心.info,核心.error,其他.info,其他.error

  • Q1綁定routingKey:核心.info,核心.error,其他.error,記錄所有核心日志,記錄其他error日志

  • Q2綁定routingKey:核心.info,其他.info,打印所有info日志

需求實(shí)現(xiàn)了,這時(shí),項(xiàng)目經(jīng)理說(shuō),兩個(gè)日志級(jí)別太不好管理了,我們加個(gè)debug級(jí)別吧!

你的內(nèi)心這樣的

萬(wàn)碼學(xué)堂,電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),Java培訓(xùn),JavaEE開(kāi)發(fā)培訓(xùn),青島軟件培訓(xùn),軟件工程師培訓(xùn)

是時(shí)候?qū)W習(xí)一下Topic Exchange了

2.Topic Exchange

topic exchange對(duì)routingKey是有要求的,必須是一個(gè)關(guān)鍵字的列表才能發(fā)揮正常作用,用“.”分割每個(gè)關(guān)鍵字,你可以定義任意的層級(jí),唯一的限制是最大長(zhǎng)度為255字節(jié)。

上述需求,我們可以把routingKey的規(guī)則定義為 “<系統(tǒng)>.<日志級(jí)別>”,這個(gè)規(guī)則是抽象的,也就是說(shuō),是在你腦子里的,并沒(méi)有地方去具體的把它綁定到exchange上,發(fā)送消息和綁定隊(duì)列完全可以不按這個(gè)規(guī)則來(lái),只會(huì)影響消息是否能分發(fā)到對(duì)應(yīng)的隊(duì)列上。

用“.”分割同樣不是強(qiáng)制要求,routingKey里不包含這個(gè)字符也不會(huì)報(bào)錯(cuò),“.”只會(huì)影響topic中對(duì)routingKey的分層解析,果不用它,那么topic的表現(xiàn)和direct一致

topic與direct的重要區(qū)別就是,它有兩個(gè)關(guān)鍵字

  1. “*”星號(hào),代表一個(gè)詞,比如上述規(guī)則:*.error 表示所有系統(tǒng)的error級(jí)別的日志

  2. “#”井號(hào),代表零個(gè)或多個(gè)詞,比如上述規(guī)則: *.# 表示所有系統(tǒng)的所有消息,與單獨(dú)一個(gè)#是等效的,core.# 表示核心系統(tǒng)的所有日志,它和 core.* 的區(qū)別是,即使以后規(guī)則改為 <系統(tǒng)>.<日志級(jí)別>.<其他條件>.<其他條件>.……,core.# 依然可以完成匹配,而 core.* 則無(wú)法匹配 core.info.xxx.xxx

第一條很好理解,第二條有點(diǎn)長(zhǎng),不會(huì)是騙人的吧?我們來(lái)實(shí)驗(yàn)一下

首先把把logs的type聲明成topic,注意在控制臺(tái)把上一章的direct類(lèi)型的logs刪除掉

        		

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式