当前位置: 首页 > news >正文

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//左&#xff0c;中&#xff0c;右 }; class simulator//模拟器 { pu…...

多个主流Python GUI库全面解析,助你用Python轻松构建精美界面

Python 作为一门易学易用的编程语言&#xff0c;在各个领域都拥有广泛的应用。而 GUI (Graphical User Interface) 编程更是让 Python 变得更加灵活&#xff0c;可以帮助我们创建各种各样的桌面应用&#xff0c;为用户提供直观的交互体验。本文将介绍几个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)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…...

在IntelliJ IDEA中使用Git推送项目

去gitee网站注册用户 gitee网站地址:https://gitee.com/ github网站地址:https://github.com/ 一、创建仓库 以下以gitee为例进行介绍&#xff0c;github操作雷同。 1、创建仓库 点击页面右上方的"“并选择"创建仓库” 2、设置仓库相关信息 首先输入仓库名&…...

CNN代码实战

CNN的原理 从 DNN 到 CNN &#xff08;1&#xff09;卷积层与汇聚 ⚫ 深度神经网络 DNN 中&#xff0c;相邻层的所有神经元之间都有连接&#xff0c;这叫全连接&#xff1b;卷积神经网络 CNN 中&#xff0c;新增了卷积层&#xff08;Convolution&#xff09;与汇聚&#xff08…...

迁移学习代码复现

一、前言 说来可能令人难以置信,迁移学习技术在实践中是非常简单的,我们仅需要保留训练好的神经网络整体或者部分网络,再在使用迁移学习的情况下把保留的模型重新加载到内存中,就完成了迁移的过程。之后,我们就可以像训练普通神经网络那样训练迁移过来的神经网络了。 我们…...

Elasticsearch(ES)常用命令

常用运维命令 一、基本命令1.1、查看集群的健康状态1.2、查看节点信息1.3、查看索引列表1.4、创建索引1.5、删除索引1.6、关闭索引1.7、打开索引1.8、查看集群资源使用情况&#xff08;各个节点的状态&#xff0c;包括磁盘&#xff0c;heap&#xff0c;ram的使用情况&#xff0…...

C/C++ 不定参函数

C语言不定参函数 函数用法总结 Va_list 作用&#xff1a;类型定义&#xff0c;生命一个变量&#xff0c;该变量被用来访问传递给不定参函数的可变参数列表用法&#xff1a;供后续函数进调用&#xff0c;通过该变量访问参数列表 typedefchar* va_list; va_start 作用&#xff…...

C语言——函数专题

1.概念 在C语言中引入函数的概念&#xff0c;有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码&#xff0c;这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数&#xff1a;库函数和自定义函数。 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 中&#xff0c;(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

原文链接&#xff1a;https://arxiv.org/abs/2407.18232 简介&#xff1a;Transformer在3D点云感知任务中有二次复杂度&#xff0c;难以进行长距离关系建模。线性RNN则计算复杂度较低&#xff0c;适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN&#xff08;即对分组…...

打造高可用集群的基石:深度解析Keepalived实践与优化

高可用集群 集群类型 集群类型主要分为负载均衡集群&#xff08;LB&#xff09;、高可用集群&#xff08;HA&#xff09;和高性能计算集群&#xff08;HPC&#xff09;三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群&#xff08;LB&#xff09; 负载均衡集…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...