(本實例都是使用的Net的客戶端,使用C#編寫),說明,中文方括號【】表示名詞。
在上一個教程中,我們改進了我們的日志記錄系統(tǒng)。 沒有使用只能夠進行虛擬廣播的【Fanout】交換機,而是使用了【Direct】類型的交換機,這樣做就可以讓我們有可能選擇性地接收日志。
雖然使用【Direct】類型的【消息交換機】改進了我們的系統(tǒng),但它仍然有限制 - 它不能基于多個標準進行路由選擇。
在我們的日志記錄系統(tǒng)中,我們可能不僅要根據(jù)嚴重性訂閱日志,還可以基于發(fā)出日志的源進行訂閱。 您可能會從syslog unix工具中了解這一概念,該工具根據(jù)嚴重性(info/warn/crit...)和設施(auth / cron / kern ...)路由日志。
這將給我們很大的靈活性 - 我們可能既想監(jiān)聽來自“cron”的重要錯誤,也可以監(jiān)聽“kern”的所有日志。
要在我們的日志記錄系統(tǒng)中實現(xiàn),我們需要了解一個更為復雜的topic類型的【消息交換機】。
1、Topic類型的【消息交換機】
發(fā)送到【Topic】類型【消息交換機】的消息不能有任意的routing_key - 它必須是由點分隔的單詞列表。 這些詞可以是任何東西,但通常它們指定與消息相關聯(lián)的一些功能。 幾個有效的路由關鍵字示例:“stock.usd.nyse”,“nyse.vmw”,“quick.orange.rabbit”。 路由關鍵字中可以有任意多的單詞,最多可達255個字節(jié)。
綁定鍵也必須是相同的形式。【Topic】類型的【消息交換機】背后的邏輯類似于【Direct】類型的【消息交換機】 - 使用特定【路由鍵】發(fā)送的消息將被傳遞到與匹配的【綁定鍵】綁定的所有隊列。 但是,【綁定鍵】有兩個重要的特殊情況:
*(星)可以替代一個字。
#(井號)可以替換零個或多個單詞。
在一個例子中最簡單的解釋一下:
在這個例子中,我們將發(fā)送所有描述動物的消息。消息將使用由三個字(兩個點)組成的【路由鍵】發(fā)送?!韭酚涉I】中的第一個字將描述速度,第二個顏色和第三個種類:“<speed>.<color>.<species>”。
我們創(chuàng)建了三個綁定:Q1綁定鍵“*.orange.*”和Q2是“*.*.rabbit”和“l(fā)azy.?!苯壎?。
這些【綁定鍵】所要表達意思可以總結為:
Q1對所有的橙色動物感興趣。
Q2想聽聽有關兔子的一切,以及關于lazy動物的一切。
將【路由鍵】設置為“quick.orange.rabbit”的消息將傳遞給兩個隊列。消息“l(fā)azy.orange.elephant”也會發(fā)送他們那兩個隊列。另一方面,“quick.orange.fox”只會發(fā)送到第一個隊列,而“l(fā)azy.brown.fox”只能發(fā)送到第二個隊列。 “l(fā)azy.pink.rabbit”將被傳遞到第二個隊列只有一次,即使它匹配兩個綁定。 “quick.brown.fox”不匹配任何綁定,所以它將被丟棄。
如果我們違反約定并發(fā)送一個或四個字的消息,如“orange”或“quick.orange.male.rabbit”,會發(fā)生什么?那么這些消息將不會匹配任何綁定,并將丟失。
另一方面,“l(fā)azy.orange.male.rabbit”即使它有四個字,將匹配上一個綁定,并將被傳遞到第二個隊列。
說明:【Topic】類型的【消息交換機】
此類型的【消息交換機】是強大的,可以像其他【消息交換機】一樣行事。
當隊列用“#”(哈希)【綁定鍵】綁定時,它將接收所有消息,而不管【路由鍵】,就像使用【Fanout】類型的【消息交換機】。
當特殊字符“*”(星號)和“?!保ü#┎挥糜诮壎〞r,【Topic】類型的【消息交換機】將表現(xiàn)得像一個使用【Direct】類型的【消息交換機】。
延伸閱讀
學習是年輕人改變自己的最好方式