0. 引言
上一节,我们说明了rocketmq中的4个核心组成以及他们之间的工作关系。但其中穿插的topic, queue等概念,如果未接触过mq的同学可能会有些迷糊,所以本节,我们重点针对rocketmq中的基本概念进行讲解,之前学习过其他mq的同学也能够形成对比。
1. 基本概念
Group:分组
rocektmq中有两种分组:消费者分组和生产者分组,每个消费者、生产者都可以属于一个分组。
一个消费者分组中的消费者都会共同消费一个topic消息,在集群模式下,一个topic的消息只能被消费者分组里的一个消费者消费,其消费进度是共享的。广播模式下,因为每个消费者都会收到消息,因此他们之间的消费进度相互独立。
同一生产者分组中的生产者发送的消息会分布到不同的Queue上,从而实现负载均衡。rocketmq 5.x版本开始,生产者是匿名的,无需管理生产者分组(ProducerGroup);对于历史版本服务端3.x和4.x版本,已经使用的生产者分组可以废弃无需再设置,且不会对当前业务产生影响
Topic:主题
topic是RocketMQ中的消息类别。一个Topic可以有多个生产者和消费者,是消息的逻辑分类。对于发送消息和消费消息而言,可见的都是topic,而具体的queue则是通过负载均衡自动分配的。
topic可以消息发送前手动创建,也可以开启broker的自动创建topic,在发送消息时自动检测topic是否存在,不存在则自动创建
Queue:队列
queue是Topic的物理分区,也是rocketmq中的最小存储单元,也就是说每个queue都是以独立的物理文件存在。一个Topic可以配置多个Queue,以实现扩展和负载均衡,默认会创建4个队列。
rocketmq中是以topic为单位进行管理,但实际传输的对象是到queue,也就是说无论消息发送还是消费都是到实际的queue中去操作。
Message:消息
消息队列中传递信息的载体,message中包含了如下信息:
- 主题名称:当前消息所属主题的名称
- 消息类型:当前消息的类型,rocektmq中支持的消息类型有:Normal 普通消息、FIFO 顺序消息、Delay 延迟消息、Transaction 事务消息
- 消息队列:存储当前消息的队列
- 消息位点:当前消息在队列中的位置
- 消息id:消息的唯一标识,集群内全局唯一,由数字和字母组成的32位字符串
- 索引Key:消息的索引键,用于快速检索消息
- 标签:消息的过滤标签,选填项,设置后消费者可以通过标签过滤指定消息
- 消息体:实际要传输的数据,采用二进制字节传输
- 定时时间:延迟消息的属性
- 消息发送时间:消息发送时,生产者客户端的本地当前时间戳
- 消息保存时间:消息在mq服务端完成落盘时的本地时间戳
- 消费重试次数:消费失败后,服务端重新投递的次数
- 自定义属性:生产者自定义的扩展信息
rocketmq中普通和顺序消息大小限制在4MB,事务和延迟消息限制在64KB
– 参考于rocetmq message消息内部属性
Tag:标签
是可以加在消息上的标识,用于过滤消息,相当于是给消息再加一个标识条件,后续消费时可以通过过滤器来过滤指定tag的消息
2. 整体关系图
如下图所示,在整体关系中,broker中包含多个topic,一个topic中包含多个queue,一个队列中有多个消息,队列是承装消息的物理载体,而每个消息中都可以标识对应的tag
3. 总结
经过前几章的讲解,我们了解了rocketmq的核心概念,下一节我们将结合实际代码来体会rocketmq的使用