1.簡介
上一章介紹了direct類型的exchange,并用它實現(xiàn)了一個偽廣播(Queue綁定多個routingKey)日志系統(tǒng),現(xiàn)在,考慮另一個問題,我們的日志系統(tǒng)不僅要分級別級別(error,info)記錄日志,還需要通過發(fā)送日志的系統(tǒng)來匹配,比如說有一個“核心”系統(tǒng),它發(fā)出的所有級別日志,都需要記錄到硬盤,其他系統(tǒng)只需要把error級別的日志記錄到硬盤。
如果用上一章的direct該怎么做呢?
給routingKey分層,變成類似這樣的字符串:核心.info,核心.error,其他.info,其他.error
Q1綁定routingKey:核心.info,核心.error,其他.error,記錄所有核心日志,記錄其他error日志
Q2綁定routingKey:核心.info,其他.info,打印所有info日志
需求實現(xiàn)了,這時,項目經(jīng)理說,兩個日志級別太不好管理了,我們加個debug級別吧!
你的內心這樣的
是時候學習一下Topic Exchange了
2.Topic Exchange
topic exchange對routingKey是有要求的,必須是一個關鍵字的列表才能發(fā)揮正常作用,用“.”分割每個關鍵字,你可以定義任意的層級,唯一的限制是最大長度為255字節(jié)。
上述需求,我們可以把routingKey的規(guī)則定義為 “<系統(tǒng)>.<日志級別>”,這個規(guī)則是抽象的,也就是說,是在你腦子里的,并沒有地方去具體的把它綁定到exchange上,發(fā)送消息和綁定隊列完全可以不按這個規(guī)則來,只會影響消息是否能分發(fā)到對應的隊列上。
用“.”分割同樣不是強制要求,routingKey里不包含這個字符也不會報錯,“.”只會影響topic中對routingKey的分層解析,果不用它,那么topic的表現(xiàn)和direct一致
topic與direct的重要區(qū)別就是,它有兩個關鍵字
“*”星號,代表一個詞,比如上述規(guī)則:*.error 表示所有系統(tǒng)的error級別的日志
“#”井號,代表零個或多個詞,比如上述規(guī)則: *.# 表示所有系統(tǒng)的所有消息,與單獨一個#是等效的,core.# 表示核心系統(tǒng)的所有日志,它和 core.* 的區(qū)別是,即使以后規(guī)則改為 <系統(tǒng)>.<日志級別>.<其他條件>.<其他條件>.……,core.# 依然可以完成匹配,而 core.* 則無法匹配 core.info.xxx.xxx
第一條很好理解,第二條有點長,不會是騙人的吧?我們來實驗一下
首先把把logs的type聲明成topic,注意在控制臺把上一章的direct類型的logs刪除掉
網(wǎng)友評論