一、Topic是什么?它的作用?
Topic即主题,是消息队列中用于对消息进行分类和组织的一种机制,它有以下三种作用:
-
标识消息分类:RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题,可以使消息更具可读性和可管理性。
-
独立的消息队列:每个主题都有自己的消息队列,用于存储该主题下的消息。每个队列都可以并行地接收和处理消息,从而实现高吞吐量和负载均衡。
-
消息路由:生产者在发送消息时指定目标主题,消费者则通过订阅感兴趣的主题来接收对应的消息。RocketMQ根据主题将消息路由到相应的队列上,然后再由消费者消费。
二、Tag是什么?它的作用?
Tag即标签,是消息队列中用于标记消息的一种属性或标识。它可以理解为Topic的子集,作用如下:
-
消息过滤:Tag可以用来标记消息的属性或特征,消费者可以根据这些标记来选择性地订阅或过滤消息。通过使用Tag,可以使得消息的订阅和消费更加灵活,消费者只接收与自己业务相关的消息,从而提高系统的效率。
-
消息路由:类似于Topic,Tag也可以用来将消息路由到相应的队列或者消费者。生产者在发送消息时可以为消息添加特定的Tag,消息队列根据Tag来将消息路由到对应的队列或者消费者,实现消息的分发和处理。
-
消息分类:Tag可以将消息进行分类,使得具有相似属性或用途的消息可以被集中处理。通过给消息添加不同的Tag,可以更好地管理和组织消息流,使得系统具有更好的可读性和可维护性。
-
消息版本控制:在一些场景下,Tag还可以用于标记消息的版本信息,帮助进行消息的版本控制和管理。通过为消息添加版本标记,可以确保消息的正确处理和兼容性,同时也方便进行消息的追溯和回溯。
三、Topic和Tag最佳实践?
在消息队列RocketMQ版中,Topic与Tag都是业务上用来归类的标识,区分在于Topic是一级分类,而Tag可以理解为是二级分类。那Topic和Taq它们如何搭配使用来实现消息过滤呢?
Topic和Tag的定义如下:
- Topic消息主题,通过Topic对不同的业务消息进行分类。
- Tag消息标签,用来进一步区分某个Topic下的消息分类消息从生产者发出即带上的属性。
到底什么时候该用Topic,什么时候该用Tag?(业务层面分析)
- 消息类型是否一致:如普通消息、事务消息、定时(延时)消息、顺序消息,不同的消息类型使用不同的Topic,无法通过Tag进行区分。
- 业务是否相关联:没有直接关联的消息,如淘宝交易消息,京东物流消息使用不同的Topic进行区分;而同样是天猫交易消息,电器类订单、女装类订单、化妆品类订单的消息可以用Tag进行区分。
- 消息优先级是否一致:如同样是物流消息,盒马必须小时内送达,天猫超市24小时内送达,淘宝物流则相对会慢一些,不同优先级的消息用不同的Topic进行区分。
- 消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的Topic。
总的来说,针对消息分类,您可以选择创建多个Topic,或者在同一个Topic下创建多个Tag。但通常情况下,不同的Topic之间的消息没有必然的联系,而Tag则用来区分同一个Topic下相互关联的消息,例如全集和子集的关系、流程先后的关系。
以天猫交易平台为例,订单消息和支付消息属于不同业务类型的消息,分别创建Topic_Order和Topic_Pav,其中订单消息根据商品品类以不同的Tag再进行细分,例如电器类、男装类、女装类、化妆品类等被各个不同的系统所接收。
通过合理的使用Topic和Tag,可以让业务结构清晰,更可以提高效率!
ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!
链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java知识宝典》