在 SOFAStack 消息队列中,Topic 与 Tag 都是业务上用来归类的标识,区分在于 Topic 是一级分类,而 Tag 可以理解为是二级分类。您可通过本文了解如何搭配使用 Topic 和 Tag 来实现消息过滤。
背景信息
Topic 和 Tag 的定义如下:
Topic:消息主题,通过 Topic 对不同的业务消息进行分类。
Tag:消息标签,用来进一步区分某个 Topic 下的消息分类,消息从生产者发出即带上的属性。
Topic 和 Tag 的关系如下图所示。
适用场景
您可能会有这样的疑问:到底什么时候该用 Topic,什么时候该用 Tag?
建议您从以下几个方面进行判断:
消息类型是否一致:如普通消息、事务消息、定时或延时消息、顺序消息,不同的消息类型使用不同的 Topic。创建 Topic 时需要指定消息类型,无法通过 Tag 进行区分。
业务是否相关联:没有直接关联的消息,如支付消息、芝麻信用消息、会员消息可以使用不同的 Topic 进行区分;而同样是支付消息,如付款、红包到账、转账等消息可以用 Tag 进行区分。
消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个 Topic,则有可能会因为过长的等待时间而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的 Topic。
总的来说,针对消息分类,您可以选择创建多个 Topic,或者在同一个 Topic 下创建多个 Tag。但通常情况下,不同的 Topic 之间的消息没有必然的联系,而 Tag 则用来区分同一个 Topic 下相互关联的消息,例如全集和子集的关系、流程先后的关系。
注意事项
同一个 Topic 下有多个 Tag 的情况时,无法区分每个 Tag 的消费进度、消息积压数量等,且 Tag 间相互影响。例如 Topic 下分为 Tag 1 和 Tag 2,假如 Tag 2 消费较慢会导致同一 Topic 下的 Tag 1 同样消费速度减慢;假如实际 Tag 1 积压 100,Tag 2 积压 200,最终只能确定该 Topic 的整体消费进度、积压量为 300,无法准确区分出每个 Tag 的消费进度和积压数量。
如为避免 Tag 间相互影响需要申请接入多个 Topic,请自行评估整体峰值,超过 5000 Quota 需向消息队列提供机器资源。