大聪明教你学Java | 深入浅出聊 RocketMQ

news2024/11/15 7:12:47

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~

在之前的博客中,大聪明给各位小伙伴分享了一下如何在 Win10 环境下搭建 RocketMQ,相信各位小伙伴都有了属于自己的一套 RocketMQ 环境。今天咱们书接上文,大聪明继续和大家深入浅出的聊一聊 RocketMQ。

🔊 传送门:大聪明教你学Java | Win10 环境下安装部署 RocketMQ

假设现在有A、B两个服务,当 A 服务发出消息后,不想让 B 服务立马处理,而是要过半小时才让 B 服务处理。比如我们在点外卖的时候就有一个这样的场景——定时外卖,也就是说到点之后订单才会投递给商家处理。那么问题来了,这类功能该怎么实现呢?俗话说,没有什么是加一层中间层不能解决的,如果有,那就再加一层。这次我们要加的中间层是消息队 RocketMQ。

在这里插入图片描述

什么是 RocketMQ

RocketMQ 是一个开源的分布式消息中间件,由阿里巴巴开发,旨在提供高吞吐量、高可靠性的消息传递服务。它是一个可水平扩展的、具有低延迟和高可用性的分布式消息队列系统。目前 RocketMQ 已经是 Apache 的顶级项目,它和其它消息队列一样,接受来自生产者的消息,将消息分类,每一类是一个 topic ,消费者根据需要订阅 topic 获取里面的消息。

看到这里,各位小伙伴是不是觉得 RocketMQ,很像我们在前面提到的消息队列 Kafka 呢🧐 那么问题自然而然就来了,既然都是消息队列,RocketMQ 和 Kafka 又有什么分别呢?

RocketMQ 和 Kafka 的区别

RocketMQ 的架构其实参考了 Kafka 的设计思想,又在 Kafka 的基础上做了一些调整,这些调整用一句话总结就是,RocketMQ 和 Kafka 相比,在架构上做了减法,在功能上做了加法,下面我们来看一下这句话的含义。

在架构上做减法

首先我们先简单回顾一下 Kafka 的架构。Kafka 也是通过多个 topic 对消息进行分类。为了提升单个 topic 的并发性能,将单个 topic 拆分为多个 Partition 为了提升系统扩展性将,多个 Partition 分别部署在不同 broker 上。为了提升系统的可用性,为 Partition 加了多个副本。同时为了协调和管理 Kafka 集群的数据消息,引入 ZooKeeper 作为协调节点。如果对这些内容比较陌生,各位小伙伴可以点击下方传送门,回顾一下之前讲到的内容 👇

🔊 传送门:大聪明教你学Java | 深入浅出聊 Kafka

下面我们再来一起看看 RocketMQ 在架构上做了哪些调整。

简化协调节点

ZooKeeper 在 Kafka 架构中会和 Broker 通信,来维护 Kafka 集群信息。一个新的 broker 连上 ZooKeeper 后,其他 broker 就能立马感知到他的加入。像这种能在分布式环境下,让多个实例同时获取到同一份信息的服务,是所谓的分布式协调服务。ZooKeeper 作为一个通用的协调服务,它不仅可以用于服务注册和发现,还可以用于分布式锁、配置管理等场景。但是话说回来,Kafka 其实只用到了他的部分功能,就多少有点杀鸡用牛刀的味道了。所以 RocketMQ 直接将 ZooKeeper 去掉,换成了 Nameserver,用一种更轻量级的方式管理消息队列的集群信息。当然,开发 Kafka 的大佬们后来也意识到了 ZooKeeper 过重的问题,所以从 2.8.0 版本就支持移除 ZooKeeper ,通过 broker 之间加入一致性算法 Raft 实现同样的效果,这就是所谓的KRaft 或 Quorum 模式。

简化分区

我们知道 Kafka 会将 topic 拆分为多个 Partition ,以此来提升并发性的。在 RocketMQ 里也一样将 topic 拆分成了多个分区,但换了个名字叫 Queue,也就是队列。Kafka 中的 Partition 会存储完整的消息体,而 RocketMQ 的 Queue 却只存一些简要信息,比如消息偏移offset,而消息的完整数据则放到一个叫 CommitLog 的文件上。通过offset我们可以定位到 CommitLog 上的某条消息。
在这里插入图片描述

消息消费

Kafka 消费消息的时候,broker 只需要直接从 Partition 读取消息返回就够了,也就是读一次就够了。而在 RocketMQ 中,broker 则需要先从 Queue 上读取到 offset 的值,再跑到 CommitLog 上将完整数据读出来,也就是需要读两次。那么问题就来了,看起来 Kafka 的设计更高效。为什么 RocketMQ 不采用 Kafka 的设计呢?这就得说一下底层存储了~

在Kafka 的底层存储中, Partition 分区其实在底层有很多段,也就是 segment 组成,每个 segment 可以认为就是个小文件,将消息数据写入到 Partition 分区,本质上就是将数据写入到某个 segment 的文件下。我们知道磁盘顺序写的性能会比随机写快很多,差距高达几十倍。那么为了提升性能,Kafka 对每个小文件都是顺序写,如果只有一个 segment 文件,那写文件的性能会很好。但当 topic 变多之后, topic 底下的 Partition 分区也会变多,对应 Partition 底下的 segment 文件也会变多。同时写多个 topic ,底下的 Partition 就是同时写多个文件。虽然每个文件内部都是顺序写,但多个文件存放在磁盘的不同地方,原本顺序写磁盘就可能劣化变成了随机写,于是写性能就降低了。

而在 RocketMQ 的底层存储中,为了缓解同时写多个文件带来的随机写问题,RocketMQ 索性将单个broke底下的多个 topic 数据全部写到一个逻辑文件 CommitLog 上,这就消除了随机写多文件的问题。将所有写操作都变成了顺序写,大大提升了 RocketMQ 在多 topic 场景下的写性能。

简化备份模型

我们知道 Kafka 会将 Partition 分散到多个 broker 中,并为 Partition 配置副本,将爬梯性分为 leader 和 follower,也就是主和从。主从 Partition 之间会建立数据同步,本质上就是同步 Partition 底下的 segment 的文件数据。而 RocketMQ 则是将 broker 上的所有 topic 数据写到 CommitLog 上,如果还像 Kafka 那样给每个分区单独建立同步通信,就还得将 CommitLog 里的内容拆开,这就还是退化为随机读写了。于是 RocketMQ 索性直接同步 CommitLog 文件,以 broker 为单位区分主从,保持高可用的同时也大大简化了备份模型。到这里,我们所熟知的 Kafka 架构就变成了 RocketMQ 架构 👇

在这里插入图片描述

在功能上做加法

虽然 RocketMQ 的架构比 Kafka 简单,但功能却比 Kafka 要更丰富。

消息过滤

我们知道 Kafka 支持通过 topic 将数据进行分类,比如订单数据和用户数据是两个不同的topic,但如果我们还想再进一步分类呢?比如同样是用户数据,还能根据 VIP 等级进一步分类。假设我们只需要获取 VIP5 的用户数据,在 Kafka 里,消费者需要消费 topic 为用户数据的所有消息,再将 VIP5 的用户数据过滤出来。而 RocketMQ 支持对消息打上标记,也就是打tag,消费者能根据 tag 过滤所需要的数据,这样消费者就可以只获取这部分数据,从而省下了消费者过滤数据时的资源消耗。

支持事务

我们知道 Kafka 支持事务,比如生产者发三条消息,这三条消息要么同时发送成功,要么同时发送失败。这确实也叫事务,但跟我们要的不太一样。写业务代码的时候,我们更想要的事务是执行一些自定义逻辑和生产者发消息,这两件事要么同时成功,要么同时失败,而这正是 RocketMQ 支持的事务能力。

加入延时队列

如果我们希望消息被投递出去之后,消费者不能立马消费到,而是过一定时间后才消费,也就是所谓的延时消息。这可以用 RocketMQ 的延时队列实现,而 Kafka 就得让程序员自己实现类似的功能了。

加入死信队列

消费消息是有可能失败的,失败后一般可以设置重试,如果多次重试失败,RocketMQ 会将消息放到一个专门的队列,方便我们后面单独处理,这种专门存放失败消息的队列就是死信队列。而 Kafka 原生并不支持死信队列,这个功能就需要我们自己实现。

消息回溯

Kafka 支持通过调整 offset 让消费者从某个地方开始消费。而 RocketMQ 除了可以调整 offset ,还支持调整时间。当然了,开发 Kafka 大佬们也意识了到了这个问题,所以从 Kafka 0.10.1 版本后也支持调整时间。

所以不那么严谨的说,RocketMQ 本质就是在架构上做了减法,在功能上做了加法的 Kafka 😎

小结

本人经验有限,有些地方可能讲的没有特别到位,如果您在阅读的时候想到了什么问题,欢迎在评论区留言,我们后续再一一探讨🙇‍

希望各位小伙伴动动自己可爱的小手,来一波点赞+关注 (✿◡‿◡) 让更多小伙伴看到这篇文章~ 蟹蟹呦(●’◡’●)

如果文章中有错误,欢迎大家留言指正;若您有更好、更独到的理解,欢迎您在留言区留下您的宝贵想法。

你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1883726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术,允许组件之间进行松耦合通信。通过使用事件监听机制,应用程序的各个组件可以在其他组件不直接引用的情况下,相互发送和接受消息。 需求 在技术派中有这样一个需求,当发布文章或…

旋转变压器软件解码simulink仿真

1.介绍 旋转变压器是一种精密的位置、速度检测装置,尤其适用于高温、严寒、潮湿、高速、振动等环境恶劣、旋转编码器无法正常工作的场合。旋转变压器在使用时并不能直接提供角度或位置信息,需要特殊的激励信号和解调、计算措施,才能将旋转变压…

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统 一 文档简介二 平台构建2.1 使用平台2.2 百度智能云2.2.1 物联网核心套件2.2.2 在线语音合成 2.3 playback语音数据准备与烧录2.4 开机语音准备与添加2.5 唤醒词识别词命令准备与添加 三 代码准备3.1 sln-local/2-iot 代码…

2025第13届常州国际工业装备博览会招商全面启动

常州智造 装备中国|2025第13届常州国际工业装备博览会招商全面启动 2025第13届常州国际工业装备博览会将于2025年4月11-13日在常州西太湖国际博览中心盛大举行!目前,各项筹备工作正稳步推进。 60000平米的超大规模、800多家国内外工业装备制造名企将云集…

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候,就需要一些粒子点缀,此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点,可以用Vertex Color与…

KUKA机器人不同运行方式

KUKA机器人有以下四种运行方式: 1、手动慢速运行(T1) 2、手动快速运行(T2) 3、自动运行(AUT) 4、外部自动运行(AUT EXT) 将示教器上的钥匙向右旋转,就会…

【数据结构之B树的讲解】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

专题五:Spring源码之初始化容器上下文

上一篇我们通过如下一段基础代码作为切入点,最终找到核心的处理是refresh方法,从今天开始正式进入refresh方法的解读。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

Study--Oracle-05-Oracler体系结构

一、oracle 体系概览 Oracle数据库的体系结构通常包括以下主要组件: 1、实例(Instance):运行数据库的软件环境,包括内存结构(SGA)和进程结构(Background Processes and User Proces…

Mysql面试合集

概念 是一个开源的关系型数据库。 数据库事务及其特性 事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。 事务特性: (1)原子性:即不可分割性,事务要么全部被执行,要么就…

Spring Boot 实现 AOP 动态热插拔功能并附DEMO源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

3D Gaussian Splatting代码中的Gaussian_Module和Cameras两个类的代码解读

Gaussian_model 讨论Gaussian_model这个类,是因为里面包含了三维高斯分布的基本信息,里面定义了各种参量的构建方式、用于优化学习的激活函数、学习率设置方法和高斯点优化过程中的增加与删除方式及对应优化器的处理方法。这个类定义在scene文件夹中的g…

探索工业AI智能摄像机的高端科技

在当今快速发展的工业智能化领域,工业AI智能摄像机系列以其卓越的性能和多功能性在国内外备受关注(文末有国外工程师的评测链接)。搭载Raspberry Pi CM4支持的旨在广泛应用,涵盖从简单的条形码扫描到基于人工智能的工业环境中的缺…

数学知识——欧拉函数

数学知识(二) 20240628 求和N互质的个数公式 先分解N,再求个数fai n欧拉函数的证明:用容斥原理 不考 求质因子 p1, … , pk 1-N中与N互质的个数, 去掉质因子倍数 是pi的倍数的有N/pi个,但是会有既是p1也是…

【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体

目录 步骤 一、通过笔刷创建静态网格体 二、破裂静态网格体 三、“统一” 多层级破裂 四、“簇” 群集化的破裂 五、几何体集的材质 六、防止几何体集自动破碎 步骤 一、通过笔刷创建静态网格体 1. 可以在Quixel Bridge中下载两个纹理,用于表示石块的内外纹…

微信小程序毕业设计-英语互助系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

微信小程序-插槽slot

一.插槽slot 在页面使用自定义组件的时候&#xff0c;如果在自定义组件里面写子组件&#xff0c;子组件的内容无法显示。 <custom01> <text slotslot-top>你好&#xff0c;上方组件</text> 你好&#xff0c;组件 <text slotslot-bottom>你好&#xf…

小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…

文件操作~

目录 1.为什么使用文件&#xff1f; 2.什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3.⼆进制文件和文本文件&#xff1f; 4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 ⽂件的打开和关闭 5.文件的顺序读写 5.1 …

志愿者管理系统带讲解,保运行

技术栈 后端: SpringBoot Mysql MybatisPlus 前端: Vue Element 分为 管理员端 用户端 功能描述 用户端 管理员端 观看地址&#xff1a; B站 &#xff1a; 【毕设者】志愿者管理系统(安装讲解源码)