RocketMQ之Topic主题详解
Topic概念定义
- 主题:RocketMQ中消息传输和存储的顶层容器,用于标识同类业务中逻辑的消息,可理解为消息的分类,主题消息的分类取决于业务,要发送的业务消息最好单独是一个Topic主题,以保证互相不被干扰
- Topic主要有两大核心作用:
1)定义数据的分类隔离:将不同业务类型的数据拆分到不同的主题中管理,通过主题实现存储的隔离性和订阅隔离性
2)定义数据的身份和权限:RocketMQ的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理
模型关系
- 在RocketMQ中主题Topic所处的流程和位置如下:

- Topic是一个逻辑概念,而非实际的消息容器
- 每个Topic包含多个消息队列(Queue),队列是消息的实际存储单元,每个队列独立存储消息,队列数量在创建Topic时可以配置,也可后续动态调整
- 生产者发送消息时,消息会根据一定策略分配到不同的队列中,常见的分配策略包括轮询(Round Robin)和哈希(Hashing)
- 消费者消费时,同样是从这些队列中拉取消息
Topic属性和配置
- Topic主要有以下内部属性可用来配置:
主题名称
- 主题名称是在创建主题时,由开发者定义,主要用于标识主题,名称需要在集群内唯一,官方给名称命名的建议如下:
1)Topic命名应该尽量使用简短、常用的字符,字符过长可能会导致拒绝收发消息
2)避免使用特殊字符,特殊字符可能会出现解析异常

队列列表
- 队列既是主题的组成单元,又是消息的最小存储单元
- 队列需要在创建主题时指定,一个主题内至少包含一个队列,消息实际存储在主题的各队列中
队列的主要作用如下: - 存储顺序性:队列天然具备顺序性,消息按照进入队列的顺序进行读取,即先进先出,消息在队列中的位置和消息之间的顺序通过位点(Offset)来标记管理
- 流式操作语义:RocketMQ基于队列的存储模型可确保消息从任意Offset读取任意数量的消息,以此实现类似聚合读取,回溯读取等特性,这些特性是RabbitMQ、ActiveMQ等非队列存储模型所不具备的
消息类型
消息类型是RocketMQ主题所支持的消息类型,在创建主题时需要选择消息类型,主要包括以下消息类型:
1)Normal
- Normal:普通消息,是RocketMQ默认的消息类型,消息本身无特殊语义,消息之间也没有任何关系
- 普通消息没有复杂的处理逻辑,适用于大多数常见的消息传递场景,消息从生产者发送到Broker,然后再由消费者拉取并处理
// 初始化消息⽣产者DefaultMQProducer producer = newDefaultMQProducer("ProducerGroupName");producer.setNamesrvAddr("127.0.0.1:9876");// 启动⽣产者producer.start();
try {// 创建⼀个消息实例,指定主题、标签和消息体Message msg = new Message("TopicTest", "TagA", ("HelloRocketMQ").getBytes(RemotingHelper.DEFAULT_CHARSET));// 发送消息到 BrokerSendResult sendResult = producer.send(msg);// 打印发送结果System.out.printf("%s%n", sendResult);
} catch (Exception e) {e.printStackTrace();
}// 关闭⽣产者producer.shutdown();
2)FIFO
- 顺序消息:消息按照发送的顺序被严格地消费,适用于对消息顺序有严格要求的场景,比如:数据实时增量同步
- RocketMQ支持两种类型的顺序消息:全局顺序消息和分区顺序消息
- 全局顺序消息可保证同一个Topic下的所有消息都按照严格的顺序被消费,即所有消息按照被发送的顺序依次被消费,由于该消息类型被限制了并发量,所以使用较少
- 分区顺序消息可保证在某个分区(某个队列)中的消息会按照顺序消费,但不同分区间的消息消费顺序无法保证;分区顺序消费通过将消息分配到不同的队列,以此实现更高的并发性能
3)Delay
- 定时/延时消息,通过指定延时的时间控制消息生产后不要立即投递,而是在延迟一定时间后才对消费者可见;延迟消息适用于延迟任务、任务超时处理、分布式定时调度等场景
4)Transaction
- 事务消息:基于消息队列来实现分布式事务,保证事务最终一致性的较好解决方案
扩展
在选择消息类型时有些限制约束:
- RocketMQ从5.0开始,支持强制校验消息类型,即每个主题只允许发送一种类型的消息,以便于更好的管理生产系统;为保证向下兼容4.x版本,强制校验功能默认开启,即:
1)消息类型必须一致:发送消息的类型,必须和目标主题定义的消息类型一致
2)主题类型必须单一:每个主题只支持一种消息类型,不允许将多种类型的消息发送到同一个主题中
Topic常见问题和解决方案
Topic拆分过细
- Topic会耗费资源,拆分过细,会消耗大量主题资源,造成系统负载过重,比如:发送企微、钉钉、公众号消息都使用一个主题,这会系统带来很大的压力
Topic拆分过粗
- 如果拆分粒度过粗,甚至不拆分,就会导致业务隔离性差,不利于独立运维和处理故障,比如:MQ阻塞,排查问题就会比较麻烦
Topic管理线上开启自动化
- RocketMQ提供了自动创建主题的功能,如果线上忘记关闭该功能,一段时间后就会产生大量垃圾主题且无法进行管理和回收,造成系统资源浪费
- 主题属于顶层资源和容器,应该拥有独立的权限管理、可观测性指标采集和监控等能力,创建和管理主题会占用一定的系统资源,因此,生产环境需要严格管理主题资源,不能随意进行增上改查操作,也建议控制好权限,修改主题操作走审批和CR,防止事故的发生
总结
- Topic是RocketMQ中核心的模型概念,用于标识同一类业务逻辑的消息
- 拆分Topic不能过细,不能过粗,适中为宜
- 从以下角度考虑拆分粒度:
1)消息类型是否一致:不同类型的消息,如顺序消息和普通消息需要使用不同的主题
2)消息业务是否关联:如果业务没有直接关联,如:淘宝的交易消息和盒马物流的消息没有业务交集,需要使用不同的消息主题;同样是淘宝交易消息,女装类订单和男装类订单可以使用同一个订单;但如果业务量较大或其他子模块应用处理业务时需要进一步拆分订单类型,也可以将男装和女装订单的消息拆分到两个主题中
3)消息量级/时效性是否相同:数量级不同或时效性不同的业务消息建议使用不同的主题,如:某些业务消息量很小但时效性要求很强,如果和某些亿万级消息量的业务使用同一个主题,会增加消息的等待时长
相关文章:
RocketMQ之Topic主题详解
Topic概念定义 主题:RocketMQ中消息传输和存储的顶层容器,用于标识同类业务中逻辑的消息,可理解为消息的分类,主题消息的分类取决于业务,要发送的业务消息最好单独是一个Topic主题,以保证互相不被干扰Topi…...
实战OpenCV之图像显示
基础入门 OpenCV提供的功能非常多,图像显示是最基础也是最直观的一部分。它让我们能够直观地看到算法处理后的效果,对于调试和验证都至关重要。在OpenCV中,图像显示主要依赖于以下四个关键的数据结构和函数。 1、Mat类。这是OpenCV中最基本的…...
I2C的10-bit地址空间
10-bit地址空间: I2C支持 10-bit的设备地址,此时的时序如下图所示: 在 10-bit地址的 I2C系统中,需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110,后接 slave地址的高 2位,第 8位仍然是 …...
TinyWebserver的复现与改进(6):定时器处理非活动连接
如果客户端长时间没有动作,会占用了许多连接资源,严重影响服务器的性能。因此需要通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。 定时器处理流程 SIGALARM触发:整个流程开始于一个 SIGALARM 信号&…...
ThinkPHP5 5.0.23 远程代码执行漏洞
目录 1、启动环境 2、漏洞利用 3、更改传参方式 4、修改参数 5、发送数据 1、启动环境 docker-compose up -d 2、访问靶机ip端口号8080 2、漏洞利用 使用burpsuite抓包软件抓包 3、更改传参方式 将 GET传参改为POST传参 4、修改参数 url参数 /index.php?scaptcha post参…...
C++鼠标键盘操作自动化
C鼠标键盘操作自动化 #pragma once #include <Windows.h> enum KEYS{A 65,W87,S83,D68,SHIFTVK_LSHIFT,ALT18,Tilde 126,//~TABVK_TAB,B66,SPACEVK_SPACE,ESCVK_ESCAPE,Q81 }; enum MOUSE {ML,MW,MR//左,中,右 }; class simulator//模拟器 { pu…...
多个主流Python GUI库全面解析,助你用Python轻松构建精美界面
Python 作为一门易学易用的编程语言,在各个领域都拥有广泛的应用。而 GUI (Graphical User Interface) 编程更是让 Python 变得更加灵活,可以帮助我们创建各种各样的桌面应用,为用户提供直观的交互体验。本文将介绍几个Python GUI 编程中常用…...
Kotlin学习-01创建kotlin学习
安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...
Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)
💕💕作者:计算机源码社 💕💕个人简介:本人 八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流&…...
在IntelliJ IDEA中使用Git推送项目
去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍,github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…...
CNN代码实战
CNN的原理 从 DNN 到 CNN (1)卷积层与汇聚 ⚫ 深度神经网络 DNN 中,相邻层的所有神经元之间都有连接,这叫全连接;卷积神经网络 CNN 中,新增了卷积层(Convolution)与汇聚(…...
迁移学习代码复现
一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…...
Elasticsearch(ES)常用命令
常用运维命令 一、基本命令1.1、查看集群的健康状态1.2、查看节点信息1.3、查看索引列表1.4、创建索引1.5、删除索引1.6、关闭索引1.7、打开索引1.8、查看集群资源使用情况(各个节点的状态,包括磁盘,heap,ram的使用情况࿰…...
C/C++ 不定参函数
C语言不定参函数 函数用法总结 Va_list 作用:类型定义,生命一个变量,该变量被用来访问传递给不定参函数的可变参数列表用法:供后续函数进调用,通过该变量访问参数列表 typedefchar* va_list; va_start 作用ÿ…...
C语言——函数专题
1.概念 在C语言中引入函数的概念,有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码,这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数:库函数和自定义函数。 2.库函数 C语言国际标准ANSIC规定了一些常…...
springboot打可执行jar包
1. pom文件如下 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…...
【SQL】科目种类
目录 题目 分析 代码 题目 表: Teacher ------------------- | Column Name | Type | ------------------- | teacher_id | int | | subject_id | int | | dept_id | int | ------------------- 在 SQL 中,(subject_id, dept_id) 是该表的主键。 该表…...
【深度学习】【语音】TTS,最新TTS模型概览,扩散模型TTS,MeloTTS、StyleTTS2、Matcha-TTS
文章目录 基础介绍对比基础介绍 MeloTTS: MeloTTS 是 MyShell.ai 开发的一个多语言语音合成模型,支持包括英语、西班牙语、法语、中文、日语和韩语等多种语言。它以高质量的语音合成为特色,尤其擅长处理中英混合内容。该模型优化了在 CPU 上的实时推理能力,使其在多种应用场…...
【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds
原文链接:https://arxiv.org/abs/2407.18232 简介:Transformer在3D点云感知任务中有二次复杂度,难以进行长距离关系建模。线性RNN则计算复杂度较低,适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN(即对分组…...
打造高可用集群的基石:深度解析Keepalived实践与优化
高可用集群 集群类型 集群类型主要分为负载均衡集群(LB)、高可用集群(HA)和高性能计算集群(HPC)三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群(LB) 负载均衡集…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
