RabbitMQ快速入门(六)Topic

相比fanout类型,基于direct类型的交换器实现的日志记录系统,可以让我们有选择的接收日志。而在其他的一些场景下,direct类型交换器仍然不能够满足人们日益增长的需求。比如:不仅需要对日志的级别进行过滤,还要对日志源进行过滤。

1.syslog消息格式

syslog在记录日志的时候,有着严格的日志格式(类似于Facility.Level)。比如,user.info表示user产生的info级别的消息;kern.error表示kernel产生的error级别的消息。syslog相关内容可参考:

Linux之syslog日志服务详解(一)

所以,如果想要实现一个不仅可以过滤日志级别,还可以过滤日志源的进阶日志记录系统,direct类型的交换器就显得无助了。topic类型的交换器可以满足这一需求。

2.topic类型交换器

该类型的交换器与direct类型的交换器的相同点是,它们都是根据routing_key来进行匹配过滤消息的。(生产者生产消息时指定的routing_key,以及消费者绑定队列与交换器时使用的routing_key)

二者主要的不同点在于:

(1)direct交换器的routing_key是一个任意单词,比如error或info等;而topic类型交换器的routing_key是多个单词,单词之间用点(.)分隔,比如user.info或kern.error等。

(2)对于消费者绑定时指定的routing_key,AMQP提供了两个特殊的符号:

1)*:可以用来替代任意一个单词;
2)#:可以用来替代零个或多个单词;

有了这两个特殊的符号,给topic类型的交换器在进行规制匹配时增加了很大的灵活性,用图2-1来直观感受一下:topic2-1

图2-1

         若消息的routing_key是“quick.orange.rabbit”,那么这条消息将被发送至Q1和Q2;若消息的routing_key是“quick.orange.fox”,那么这条消息将被发送至Q1;若消息的routing_key是“lazy.brown.fox”,那么这条消息将被发送至Q2;若消息的routing_key是“quick.brown.fox”,该条消息将被丢弃。

3.示例

了解这些之后,使用topic类型的交换器就可以实现一个用来过滤类似于syslog日志格式的日志记录系统了。

(1)生产者

(2)消费者

(3)接收所有源产生的所有级别的日志:

#消费者

#生产者

(4)接收内核产生的所有级别的日志:

#消费者

#生产者

(5)接收所有源产生的emerge级别日志

#消费者

#生产者

(6)接收内核产生的所有级别的日志,以及任意源产生的emerge级别的日志

#消费者

#生产者

 

参考:
http://www.rabbitmq.com/tutorials/tutorial-five-python.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注