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消息。


猜你喜欢

转载自www.cnblogs.com/zhangbLearn/p/9559336.html