在direct演示里,我们的日志系统实现了可选择性的接收日志。但仍旧有一些限制:不能基于多种标准进路由。在一个完整的日志系统中,我们可能不仅要根据日志的严重级别来接收日志,可能需要基于日志的来源来进行路由。
什么叫日志的来源呢?
就是引发日志的设备。比如设备auth/cron/kern。我们可以监听来自corn的错误日志,同时也监听kern的所有日志。这使得我们记录日志更加灵活。
通过topic类型的交换机,我们来演示如何实现这一功能。对于topic交换机的消息的路由键routing key不能任意给定。它必须是一些单词的集合,中间用点号.分割。这些单词可以任意,但通常要体现出消息的特征。一些有效的路由键示例:stock.usd.nyse,nyse.vmw,quick.orange.rabbit。这些路由键可以包含很多单词,但路由键总长度不能超过255个字节。
Topic exchange
非常强大,可以实现其他任意路由器的功能。当一个队列以绑定键
#
绑定,它将会接收到所有的消息,而无视路由键(实际是绑定键#
匹配了任意的路由键)。----这和fanout
路由器一样了。当
*
和#
这两个特殊的字符不出现在绑定键中,Topic exchange
就会和direct exchange
类似了。<facility>.<severity>
为路由键。消费者: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
消息。