Rabbitmq-topic演示


  在direct演示里,我們的日志系統實現了可選擇性的接收日志。但仍舊有一些限制:不能基於多種標准進路由。在一個完整的日志系統中,我們可能不僅要根據日志的嚴重級別來接收日志,可能需要基於日志的來源來進行路由。

什么叫日志的來源呢?

  就是引發日志的設備。比如設備auth/cron/kern。我們可以監聽來自corn的錯誤日志,同時也監聽kern的所有日志。這使得我們記錄日志更加靈活。

通過topic類型的交換機,我們來演示如何實現這一功能。對於topic交換機的消息的路由鍵routing key不能任意給定。它必須是一些單詞的集合,中間用點號.分割。這些單詞可以任意,但通常要體現出消息的特征。一些有效的路由鍵示例:stock.usd.nyse,nyse.vmw,quick.orange.rabbit。這些路由鍵可以包含很多單詞,但路由鍵總長度不能超過255個字節。

綁定鍵binding key也必須是這種形式。topic路由器背后的邏輯與direct路由器類似:以特定路由鍵發送的消息將會發送到所有綁定鍵與之匹配的隊列中。但綁定鍵有兩種特殊的情況:
  *(星號)僅代表一個單詞
  #(井號)代表任意個單詞
下圖可以很好地解釋這兩個符號的含義:

對於上圖的例子,我們將會發送描述動物的消息。這些消息將會以由三個單詞組成的路由鍵發送。路由鍵中的第一個單詞描述了速度,第二個描述了顏色,第三個描述了物種:<speed>.<colour>.<species>。
我們創建了三個綁定,Q1的綁定鍵為*.orange.*,Q2的綁定鍵有兩個,分別是*.*.rabbit和lazy.#。
上述綁定關系可以描述為:
①Q1關注所有顏色為orange的動物。
②Q2關注所有的rabbit,以及所有的lazy的動物。
如果一個消息的路由鍵是quick.orange.rabbit,那么Q1和Q2都可以接收到,路由鍵是lazy.orange.elephant的消息同樣如此。但是,路由鍵是quick.orange.fox的消息只會到達Q1,路由鍵是lazy.brown.fox的消息只會到達Q2。注意,路由鍵為lazy.pink.rabbit的消息只會到達Q2一次,盡管它匹配了兩個綁定鍵。路由鍵為quick.brown.fox的消息因為不和任意的綁定鍵匹配,所以將會被丟棄。
假如我們不按常理出牌:發送一個路由鍵只有一個單詞或者四個單詞的消息,像orange或者quick.orange.male.rabbit,這樣的話,這些消息因為不和任意綁定鍵匹配,都將會丟棄。但是,lazy.orange.male.rabbit消息因為和lazy.#匹配,所以會到達Q2,盡管它包含四個單詞。
 
Topic exchange
   Topic exchange非常強大,可以實現其他任意路由器的功能。
  當一個隊列以綁定鍵 #綁定,它將會接收到所有的消息,而無視路由鍵(實際是綁定鍵 #匹配了任意的路由鍵)。----這和 fanout路由器一樣了。
  當 *#這兩個特殊的字符不出現在綁定鍵中, Topic exchange就會和 direct exchange類似了。
 
Coding案例:現在將日志系統使用topic交換機,並假設所有日志消息以兩個單詞 <facility>.<severity>為路由鍵。
 
生產者:EmitLogTopic

 

消費者:ReceiveLogsTopic

 

測試參數:日志嚴重級別info/warn/crit...和設備auth/cron/kern...

測試步驟: 

消費者:
  將String bingingKeys[] = {""}改為String bingingKeys[] = {"#"},啟動第一個消費者;
  再改為String bingingKeys[] = {"kern.*"},啟動第二個消費者;
  再改為String bingingKeys[] = {"*.critical"},啟動第三個消費者;
  再改為String bingingKeys[] = {"kern.*", "*.critical"},啟動第四個消費者。

生產者,發送多個消息,如:
  路由鍵為kern.critical 的消息:A critical kernel error
  路由鍵為kern.info 的消息:A kernel info
  路由鍵為kern.warn 的消息:A kernel warning
  路由鍵為auth.critical 的消息:A critical auth error
  路由鍵為cron.warn 的消息:A cron waning
  路由鍵為cron.critical 的消息:A critical cron error

試試最后的結果:第一個消費者將會接收到所有的消息,第二個消費者將會kern的所有嚴重級別的日志,第三個消費者將會接收到所有設備的critical消息,第四個消費者將會接收到kern設備的所有消息和所有critical消息。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM