1. 回顾路由模式
在路由模式中,我们允许了消费者根据routing_key监听部分的消息,即
生产者产生消息时定义消息的routing_key参数设置exchange类型为direct把队列绑定到exchange时定义其routing_key参数 那么消费者就可以通过这个队列“订阅”到他所想要的数据
2. 路由模式的局限性
通过routing_key,可以筛选出部分数据,但往往需要多个字段才可以筛选出想要的消息,比如对于日志来说,我们想根据日志的等级(debug/info/warning/critical/error),除此之外,还希望加上产生该日志的源的信息(auth/cron/kern)这时候,就要借助“topic” 话题类型的exchange
3. 话题模式
3.1 多个字段
对于话题模式,routing key就不再是一个单一的字符串,而是一系列由“.”分隔的字段,比如:
“quick.orange.rabbit”“stock.usd.nyse” 长度限制是255字节
3.2 支持通配符
还可以用通配符:
“*” 表示一个词 (比如"*.orange.*"和"quick.orange.rabbit"是相匹配的)“#” 表示0个或多个词 (比如"quick.#"和"quick.orange.rabbit"是相匹配的)
3.3 例子
假设我们所有的消息都是用来形容一种动物,routing_key的格式统一如下:
<食性>.<颜色>.<物种>
那么一个例子就是"herbivore.white.rabbit" -> “食草.白色.兔子”如果一个队列绑定exchange的routing_key是"*.white.*", 那么说明它对所有白色的动物感兴趣,所有符合"*.white.*"模式的消息,都会被推送到这个队列如果是"carbivore.#", 那么说明它对所有肉食性动物感兴趣,而不管颜色或物种。所有符合"carbivore.#"模式的消息,都会被推送到这个队列不符合模式的消息就会被丢弃,如果一个消息的routing_key是"orange", 不能匹配任何队列,就被丢弃了。
3.4 特殊情况
如果一个队列的routing_key是"#", 那么所有传递到它绑定的exchange的消息都会被推送到它这里如果routing_key中没有"#“或者”*",那么效果就会和direct状态下一样。
转载请注明原文地址:https://blackberry.8miu.com/read-35552.html