1.简介

上一章介绍了direct类型的exchange,并用它实现了一个伪广播(Queue绑定多个routingKey)日志系统,现在,考虑另一个问题,我们的日志系统不仅要分级别级别(error,info)记录日志,还需要通过发送日志的系统来匹配,比如说有一个“核心”系统,它发出的所有级别日志,都需要记录到硬盘,其他系统只需要把error级别的日志记录到硬盘。

如果用上一章的direct该怎么做呢?

  • 给routingKey分层,变成类似这样的字符串:核心.info,核心.error,其他.info,其他.error

  • Q1绑定routingKey:核心.info,核心.error,其他.error,记录所有核心日志,记录其他error日志

  • Q2绑定routingKey:核心.info,其他.info,打印所有info日志

需求实现了,这时,项目经理说,两个日志级别太不好管理了,我们加个debug级别吧!

你的内心这样的

万码学堂,电脑培训,计算机培训,Java培训,JavaEE开发培训,青岛软件培训,软件工程师培训

是时候学习一下Topic Exchange了

2.Topic Exchange

topic exchange对routingKey是有要求的,必须是一个关键字的列表才能发挥正常作用,用“.”分割每个关键字,你可以定义任意的层级,唯一的限制是最大长度为255字节。

上述需求,我们可以把routingKey的规则定义为 “<系统>.<日志级别>”,这个规则是抽象的,也就是说,是在你脑子里的,并没有地方去具体的把它绑定到exchange上,发送消息和绑定队列完全可以不按这个规则来,只会影响消息是否能分发到对应的队列上。

用“.”分割同样不是强制要求,routingKey里不包含这个字符也不会报错,“.”只会影响topic中对routingKey的分层解析,果不用它,那么topic的表现和direct一致

topic与direct的重要区别就是,它有两个关键字

  1. “*”星号,代表一个词,比如上述规则:*.error 表示所有系统的error级别的日志

  2. “#”井号,代表零个或多个词,比如上述规则: *.# 表示所有系统的所有消息,与单独一个#是等效的,core.# 表示核心系统的所有日志,它和 core.* 的区别是,即使以后规则改为 <系统>.<日志级别>.<其他条件>.<其他条件>.……,core.# 依然可以完成匹配,而 core.* 则无法匹配 core.info.xxx.xxx

第一条很好理解,第二条有点长,不会是骗人的吧?我们来实验一下

首先把把logs的type声明成topic,注意在控制台把上一章的direct类型的logs删除掉

        		

延伸阅读

学习是年轻人改变自己的最好方式-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训学习是年轻人改变自己的最好方式