RocketMq是阿里出品(基于MetaQ)的开源中间件,已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现,十万级数据吞吐量,ms级处理速度,分布式架构,功能强大,扩展性强。
官方文档
Linux 安装 RocketMq-CSDN博客
Springboot 集成 RocketMq(入门)-CSDN博客
1.定义
主题是 RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。 主题的作用主要如下:
1.1 定义数据的分类隔离
RocketMQ 建议将不同业务类型的数据拆分到不同的主题中管理,通过主题实现存储的隔离性和订阅隔离性。
1.2 定义数据的身份和权限
RocketMQ 的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限关理。
2.模型关系
主题是 RocketMQ 的顶层存储,所有消息资源的定义都在主题内部完成,但主题是一个逻辑概念,并不是实际的消息容器。
主题内部由多个队列组成,消息的存储和水平扩展能力最终是由队列实现的;并且针对主题的所有约束和属性设置,最终也是通过主题内部的队列来实现。
3.内部属性
3.1 主题名称
定义:主题的名称,用于标识主题,主题名称集群内全局唯一。
3.2 队列列表
定义:队列作为主题的组成单元,是消息存储的实际容器,一个主题内包含一个或多个队列,消息实际存储在主题的各队列内。
写队列:发送消息时根据写队列数量返回路由信息。
读队列:消费时按照读队列的个数返回路由信息。
3.3 消息类型
定义:主题所支持的消息类型。
Normal:普通消息。
FIFO:顺序消息。
Delay:定时/延时消息。
Transaction:事务消息.
约束:RocketMQ 从5.0版本开始,支持强制校验消息类型,即每个主题只允许发送一种消息类型的消息,这样可以更好的运维和管理生产系统,避免混乱。为保证向下兼容4.x版本行为,强制校验功能默认关闭,推荐通过服务端参数 enableTopicMessageTypeCheck 开启校验。
4.主题的类型
普通主题:这里的topic是用户创建主题。
重试主题:这里的topic是消息发送失败时候系统为之创建的主题。
死信主题:这里的topic类似垃圾箱,无法从中生产或者消费消息。
系统主题:这里的topic是Brocker启动后就自动生成的主题。
5.生产中使用建议
5.1 关闭自动创建主题的功能
主题属于顶层资源和容器,拥有独立的权限管理、可观测性指标采集和监控等能力,创建和管理主题会占用一定的系统资源。因此,生产环境需要严格管理主题资源,请勿随意进行增、删、改、查操作。
5.2 手动控制台创建
5.2.1 队列
当读队列数量 >= 写队列数量业务可以正常进行。
当读队列数量 = 写队列数量效果最佳。
如果想调整读写队列的数量,首先减少写队列数量再减少读队列的数量(确保已读完)。
假设创建了4个写队列2个读队列则有两个队列的消息无法被消费,反之则存在两个空闲的读队列。
RocketMq不直接将读写队列设置相同直接目的是为了安全的收缩队列数量,间接的为了安全的扩容。
5.2.2 perm
6:读写状态,当前队列允许读取消息和写入消息。
4:只读状态,当前队列只允许读取消息,不允许写入消息。
2:只写状态,当前队列只允许写入消息,不允许读取消息。
0:不可读写状态,当前队列不允许读取消息和写入消息。
5.3 单一主题只收发一种类型消息
主题的设计原则为通过主题隔离业务,不同业务逻辑的消息建议使用不同的主题。同一业务逻辑消息的类型都相同,因此,对于指定主题,应该只收发同一种类型的消息。