【RocketMQ系列十】RocketMQ的核心概念说明

简介: 【RocketMQ系列十】RocketMQ的核心概念说明

本文将详细介绍RocketMQ中的核心概念(领域模型),包括主题,队列,消息,生产者,消费者和消费者组,订阅关系等核心概念。

1. 模型关系

在详细介绍各个领域模型之前,首先让我们整体来预览下各个模型之间的关系图。

从图中可以看出整体关系是,生产者发送消息到某个Topic中的某个队列中,消费者通过订阅关系订阅指定Topic中消息。

1. 主题(Topic)

主题是RocketMQ中消息传输和存储的的顶层容器,用于标识同一类型业务逻辑的消息。主题只是一个逻辑概念,它并不是一个实际的消息容器。

主题的作用有两个:

  1. 定义数据的分类隔离:RocketMQ官方建议将不同业务类型的数据拆分到不同的主题中,比如线上商品购物场景下,订单交易如创建订单,支付,取消等订单消息使用同一个主题,物流相关的消息可以使用同一个主题,积分相关的消息可以使用同一个主题
  2. 定义数据的身份和权限:RocketMQ中的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理。

1.1. 主题的内部属性:

  1. 主题名称:主题名称用于标识主题,主题名称在集群内部全局唯一。
  2. 队列列表:队列是主题的组成单元,是消息实际存储的容器, 一个主题下有一个或多个队列。在RocketMQ集群中实际上是通过broker来管理队列列表的。
  3. 消息类型:RocketMQ在创建主题的时候可以指定主题中存放的消息类型。默认有: Normal (普通消息),FIFO (顺序消息),Delay(定时/延迟消息),Transaction(事务消息)

1.2. 使用建议

由于主题(Topic)非常重要,RocketMQ官方建议在生产环境中不能开启自动创建主题的配置,以免产生大量垃圾主题,无法管理和回收浪费系统资源。

RocketMQ官方推荐在RocketMQ 5.0版本下使用 myadmin命令来创建主题,创建命令是:

./bin/mqadmin updateTopic -n <nameserver_address> -t <topic_name> -c <cluster_name> -a +message.type=<message_type>

nameserver_address: 是Nameserver集群的地址,比如:172.31.184.89:9876

topic_name:是主题名称

cluster_name:是broker集群的名称

message_type:表示消息类型,可以填入: Normal ,FIFO ,Delay,Transaction,不填默认就是普通消息。

比如下面创建一个名称为 feige_FIFOTopic的存放顺序消息的主题

./bin/mqadmin updateTopic -n 172.31.184.89:9876 -t feige_FIFOTopic -c rocketmq-cluster -a +message.type=FIFO

2. 队列

队列是RocketMQ中消息传输和存储的实际容器,是RocketMQ中消息存储的最小单元。RocketMQ中所有主题都是由多个队列组成。

队列具有天然的顺序性,即按照消息写入的顺序存入队列中。队头存的是最先写入的消息,队尾存的是最近写入的消息。

消息在队列里的顺序和消息之间的顺序通过位点(offset)来进行标记管理,RocketMQ中消息被消费会记录当前已经消费到的消息的offset,下次则从此offset位点继续消费。

RocketMQ支持在任意位点消费任意数量的消息,RocketMQ中消息在队列中被消费之后并不会随即出队列,而是会默认保留48小时,这也保证了在RocketMQ中消息可以被回溯消费,以及进行消息失败重试等操作。

一个Topic的MessageQueue中的消息只能被一个消费者组中的一个消费者消费。一个MessageQueue中的消息不允许同一个消费者组中的多个消费者同时消费。

3. 消息

消息是RocketMQ中最小的数据传输单元,生产者将需要发送的数据包装成消息发送给RocketMQ的服务端。

消息具有两大特性:

  1. 消息不可变性:消息一旦产生,消息的内容即不可改变,即使经过传输链路的控制也不会发生变化。
  2. 消息持久化:RocketMQ默认会对消息进行持久化,即消息会被保存到RocketMQ服务端的存储文件中,从而保证了消息的可回溯性和系统故障场景下的可恢复性。

3.1. 消息的内部属性

在消息被发送成功之后我们可以看到如下输出信息:

SendResult [sendStatus=SEND_OK, msgId=0A299C7A551414DAD5DC2C3A61960000, offsetMsgId=AC1FB85900002A9F00000000002D9A88, messageQueue=MessageQueue [topic=SQLFilterTest, brokerName=broker-b, queueId=2], queueOffset=2]
  1. 主题名称:当前消息所属的主题的名称。集群内全局唯一。
  2. 消息类型:当前消息的类型
  3. 消息队列(queueId):实际存储当前消息的队列
  4. 消息位点(queueOffset): 当前消息存储在队列中的位置。
  5. 消息ID(msgId):消息的唯一标识,集群内每条消息的ID全局唯一。
  6. 索引Key列表(可选):消息的索引键,可通过设置不同的key区分消息和快速查找消息
  7. 过滤标签Tag(可选):消息的过滤标签。消费者可通过Tag对消息进行过滤,仅接收指定标签的消息。
  8. 定时时间:定时场景下,消息触发延时投递的毫秒级时间戳。
  9. 消息发送时间:消息发送时,生产者客户端系统的本地毫秒级时间戳。
  10. 消息保存时间戳:消息在 RocketMQ 服务端完成存储时,服务端系统的本地毫秒级时间戳。 对于定时消息和事务消息,消息保存时间指的是消息生效对消费方可见的服务端系统时间。
  11. 消费重试次数:息消费失败后,RocketMQ 服务端重新投递的次数。每次重试后,重试次数加1。由服务端系统标记。首次消费,重试次数为0;消费失败首次重试时,重试次数为1。
  12. 消息负载:业务消息的实际报文数据。

RocketMQ限制消息大小,普通消息限制在4MB以内,事务和定时消息限制在 64KB

4. 生产者

用来构建并发送消息到RocketMQ服务端的运行实体,一般是集成到业务系统中。

生产者可以发送普通消息,顺序消息,定时消息以及事务消息。

由于创建和销毁生产比较耗费系统资源, 故RocketMQ官方不建议在单一进程中创建大量生产者。

5. 消费者组

RocketMQ系统中承载多个消费行为一致的消费者的负载均衡分组,消费者组是一个逻辑概念。

5.1. 内部属性

  1. 消费者分组名称:用于区分不同消费者分组,消费者分组名称在集群内全局唯一。
  2. 投递顺序性:消费者消费消息时, RocketMQ 向消费者客户端投递消息的顺序。
  3. 消费重试策略:消费者消费消息失败时,系统的重试策略。消费者消费消息失败时,系统会按照重试策略,将指定消息投递给消费者重新消费。
  4. 订阅关系:当前消费者分组关联的订阅关系集合。包括消费者订阅的主题,以及消息的过滤规则等。

RocketMQ通过消费者分组来实现消费者的管理,同一分组内的消费者共同分摊消息并进行消费,因此,为了保证分组内消息的正常负载和消费。RocketMQ要求同一个消费者分组下所有消费者的消费行为要保持一致。

5.2. 使用建议

  1. 分组内消费者的投递顺序一致
    同一消费者分组下所有消费者的消费投递顺序是相同的,统一都是顺序投递或并发投递,不同业务场景不能混用消费者分组。
  2. 分组内消费者的业务类型一致
    一般消费者分组和主题对应不同业务域对消息消费的要求不同,因此,不同业务域主题的消费建议使用不同的消费者分组,避免一个消费者分组消费超过10个主题。

6. 消费者

消费者是RocketMQ中用来接收并处理消息的运行实体,消费者从RocketMQ服务端获取消息并进行解析。消费者通常被集成到业务系统中。

RocketMQ中提供了推模式的消费者DefaultMQPushConsumer,以及拉模式的消费者

7.订阅关系

RocketMQ系统中消费者获取消息,处理消息的规则和状态配置。

7.1 .订阅关系判断原则

RocketMQ 的订阅关系按照消费者分组和主题粒度设计,因此,一个订阅关系指的是指定某个消费者分组对于某个主题的订阅,判断原则如下:

不同消费者分组对于同一个主题的订阅相互独立如下图所示,消费者分组Group A和消费者分组Group B分别以不同的订阅关系订阅了同一个主题Topic A,这两个订阅关系互相独立,可以各自定义,不受影响。

同一个消费者分组对于不同主题的订阅也相互独立如下图所示,消费者分组Group A订阅了两个主题Topic A和Topic  B,对于Group A中的消费者来说,订阅的Topic A为一个订阅关系,订阅的Topic  B为另外一个订阅关系,且这两个订阅关系互相独立,可以各自定义,不受影响。

7.2 .内部属性

  1. 过滤类型消息过滤规则的类型。订阅关系中设置消息过滤规则后,系统将按照过滤规则匹配主题中的消息,只将符合条件的消息投递给消费者消费,实现消息的再次分类。
  • TAG过滤:按照Tag字符进行全文过滤匹配。
  • SQL92过滤:按照SQL语法对消息属性进行过滤匹配。
  1. 过滤表达式
  • 自定义的过滤规则表达式。

7.3. 使用建议

  1. 建议不要频繁修改订阅关系。

参考

https://rocketmq.apache.org/zh/docs/domainModel/01main

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7月前
|
消息中间件 中间件 数据安全/隐私保护
RabbitMQ 的核心概念
RabbitMQ 的核心概念
43 2
|
4月前
|
消息中间件 存储 网络协议
消息中间件RabbitMQ---概述和概念 【一】
该文章提供了对消息中间件RabbitMQ的全面概述,包括其核心概念、工作原理以及与AMQP和JMS的关系。
消息中间件RabbitMQ---概述和概念 【一】
|
5月前
|
消息中间件 负载均衡 算法
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略
142 2
|
5月前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
148 1
|
6月前
|
消息中间件 存储 中间件
【主流技术】聊一聊消息队列 RocketMQ 的基本结构与概念
2.6Broker 代理服务器(Broker)是消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 2.7Pull Consumer 拉取式消费(Pull Consumer)是 Consumer 消费的一种类型,也是默认的类型。下游应用系统通常主动调用 Consumer 的拉消息方法从 Broke r服务器拉消息,即主动权由下游应用控制。一旦获取了批量消息,应用就会启动消费过程。
|
6月前
|
消息中间件 存储 物联网
RocketMQ基础概念
RocketMQ基础概念
62 1
|
7月前
|
消息中间件 存储 Apache
RocketMQ实战教程之常见概念和模型
Apache RocketMQ 实战教程介绍了其核心概念和模型。消息是基本的数据传输单元,主题是消息的分类容器,支持字节、数字和短划线命名,最长64个字符。消息类型包括普通、顺序、事务和定时/延时消息。消息队列是实际存储和传输消息的容器,是主题的分区。消费者分组是一组行为一致的消费者的逻辑集合,也有命名限制。此外,文档还提到了一些使用约束和建议,如主题和消费者组名的命名规则,消息大小限制,请求超时时间等。RocketMQ 提供了多种消息模型,包括发布/订阅模型,有助于理解和优化消息处理。
|
7月前
|
消息中间件 Java API
RabbitMQ(基础概念, 简单使用)(下)
RabbitMQ(基础概念, 简单使用)
55 0
|
7月前
|
消息中间件 存储 Java
RabbitMQ(基础概念, 简单使用)(中)
RabbitMQ(基础概念, 简单使用)
38 0
|
7月前
|
消息中间件 存储 中间件
RabbitMQ(基础概念, 简单使用)(上)
RabbitMQ(基础概念, 简单使用)
57 0