一、简介
在 RocketMQ 中,消息的 Topic 和 Tag 是用于标识和分类消息的两个关键属性。它们有不同的作用和使用方式。
1、Topic(主题):
- Topic 是消息的高层分类,用于区分不同类型或业务领域的消息。 一个 RocketMQ 集群中可以有多个 Topic,每个 Topic 包含一组相关的消息。
- 生产者发送消息时,需要指定消息所属的 Topic。消费者订阅消息时,也需要指定要消费的 Topic。
- 示例:假设有一个电商系统,可以有不同的 Topic 用于存储订单消息、库存消息等,如 OrderTopic、InventoryTopic。
2、Tag(标签):
- Tag 是在 Topic 的基础上对消息进行更细粒度的分类,用于进一步筛选和过滤消息。
- 每个消息可以有一个或多个 Tag。同一个 Topic 下的不同消息可以使用相同的 Tag,也可以使用不同的 Tag。Tag 的使用有助于根据业务需求更灵活地过滤和查询消息。
- 示例:在 OrderTopic 中,可以有不同的 Tag 表示不同的订单状态,如 Paid、Shipped。
二、什么时候该用 Topic,什么时候该用 Tag?
可以从以下几个方面进行判断:
- 消息类型是否一致:如普通消息、事务消息、定时(延时)消息、顺序消息,不同的消息类型使用不同的 Topic,无法通过 Tag 进行区分。
- 业务是否相关联:没有直接关联的消息,如淘宝交易消息,京东物流消息使用不同的 Topic 进行区分;而同样是天猫交易消息,电器类订单、女装类订单、化妆品类订单的消息可以用 Tag 进行区分。
- 消息优先级是否一致:如同样是物流消息,盒马必须小时内送达,天猫超市 24 小时内送达,淘宝物流则相对会慢一些,不同优先级的消息用不同的 Topic 进行区分。
- 消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。
总的来说,针对消息分类,您可以选择创建多个 Topic,或者在同一个 Topic 下创建多个 Tag。但通常情况下,不同的 Topic 之间的消息没有必然的联系,而 Tag 则用来区分同一个 Topic 下相互关联的消息,例如全集和子集的关系、流程先后的关系。
三、使用方式:
1、Topic 的使用方式:
在生产者发送消息时,需要指定消息所属的 Topic。例如,使用 RocketMQ Java SDK 的 send 方法时,需要传递 topic 参数。
在消费者订阅消息时,需要指定要消费的 Topic。例如,使用 RocketMQ Java SDK 的 subscribe 方法时,需要传递 topic 参数。
// 生产者发送消息
Message message = new Message("OrderTopic", "Paid", "Order123", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.send(message);
// 消费者订阅消息
consumer.subscribe("OrderTopic", "*");
2、Tag 的使用方式:
在生产者发送消息时,可以为消息设置 Tag。例如,在 RocketMQ Java SDK 的 Message 对象中设置 tags 属性。
在消费者订阅消息时,可以根据需要过滤特定 Tag 的消息。例如,使用 RocketMQ Java SDK 的 subscribe 方法时,可以传递包含 Tag 的表达式,如 “Paid || Shipped”。
// 生产者发送消息,设置 Tag
Message message = new Message("OrderTopic", "Paid", "Order123", "Hello RocketMQ".getBytes());
SendResult sendResult = producer.send(message);
// 消费者订阅消息,过滤特定 Tag 的消息
consumer.subscribe("OrderTopic", "Paid || Shipped");
总体而言,Topic 用于大致分类消息,而 Tag 用于更具体地标识和过滤消息。使用这两个属性,可以在 RocketMQ 中更好地管理和组织消息。