本文介绍云消息队列 RocketMQ 版中主题(Topic)的定义、模型关系、内部属性、行为约束、版本兼容性及使用建议。
定义
主题是云消息队列 RocketMQ 版中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。
主题的作用主要如下:
定义数据的分类隔离
在云消息队列 RocketMQ 版的方案设计中,建议将不同业务类型的数据拆分到不同的主题中管理,通过主题实现存储的隔离性和订阅隔离性。
定义数据的身份和权限
云消息队列 RocketMQ 版的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理。
模型关系
在整个云消息队列 RocketMQ 版的领域模型中,主题所处的流程和位置如下:
主题是云消息队列 RocketMQ 版的顶层存储,所有消息资源的定义都在主题内部完成,但主题是一个逻辑概念,并不是实际的消息容器。
主题内部由多个队列组成,消息的存储和水平扩展能力最终是由队列实现的;并且针对主题的所有约束和属性设置,最终也是通过主题内部的队列来实现。
内部属性
行为约束
消息类型强制校验
云消息队列 RocketMQ 版 5.x版本将消息类型拆分到主题中进行独立运维和处理,因此系统会对发送的消息类型和主题定的消息类型进行强制校验,若校验不通过,则消息发送请求会被拒绝,并返回类型不匹配异常。校验原则如下:
消息类型必须一致
发送的消息的类型,必须和目标主题定义的消息类型一致。
主题类型必须单一
每个主题只支持一种消息类型,不允许将多种类型的消息发送到同一个主题中。
常见错误使用场景
发送的消息类型不匹配
例如,创建主题时消息类型定义为顺序消息,发送消息时发送事务消息到该主题中,此时消息发送请求会被拒绝,并返回类型不匹配异常。
单一消息主题混用
例如,创建主题时消息类型定义为普通消息,发送消息时同时发送普通消息和顺序消息到该主题中,则顺序消息的发送请求会被拒绝,并返回类型不匹配异常。
版本兼容性
消息类型的强制校验,仅针对云消息队列 RocketMQ 版服务端5.x版本生效。
云消息队列 RocketMQ 版服务端4.x版本实例未对消息类型强制校验,但建议使用时保证消息类型一致
使用建议
按照业务分类合理拆分主题
云消息队列 RocketMQ 版的主题拆分设计应遵循大类统一原则,即将相同业务域内同一功能属性的消息划分为同一主题。拆分主题时,您可以从以下角度考虑拆分粒度:
消息类型是否一致:不同类型的消息,如顺序消息和普通消息需要使用不同的主题。
消息业务是否关联:如果业务没有直接关联,比如,淘宝交易消息和盒马物流消息没有业务交集,需要使用不同的消息主题;同样是淘宝交易消息,女装类订单和男装类订单可以使用同一个主题。当然,如果业务量较大或其他子模块应用处理业务时需要进一步拆分订单类型,您也可以将男装订单和女装订单的消息拆分到两个主题中。
消息量级是否一样:数量级不同或时效性不同的业务消息建议使用不同的主题,例如某些业务消息量很小但是时效性要求很强,如果跟某些万亿级消息量的业务使用同一个主题,会增加消息的等待时长。
正确拆分示例:线上商品购买场景下,订单交易如订单创建、支付、取消等流程消息使用一个主题,物流相关消息使用一个主题,积分管理相关消息使用一个主题。
错误拆分示例:
拆分粒度过粗:会导致业务隔离性差,不利于独立运维和故障处理。例如,所有交易消息和物流消息都共用一个主题。
拆分粒度过细:会消耗大量主题资源,造成系统负载过重。例如,按照用户ID区分,每个用户ID使用一个主题。
单一主题只收发一种类型消息,避免混用
云消息队列 RocketMQ 版主题的设计原则为通过主题隔离业务,不同业务逻辑的消息建议使用不同的主题。同一业务逻辑消息的类型都相同,因此,对于指定主题,应该只收发同一种类型的消息。
主题管理尽量避免自动化机制
在云消息队列 RocketMQ 版架构中,主题属于顶层资源和容器,拥有独立的权限管理、可观测性指标采集和监控等能力,创建和管理主题会占用一定的系统资源。因此,生产环境需要严格管理主题资源,请勿随意进行增、删、改、查操作。