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

前言

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

在之前的博客中,大聪明给各位小伙伴分享了一下如何在 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 😎

小结

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一、课程介绍,基础—环境安装、判断、循环语句等(爬虫及数据可视化)

一、课程介绍,基础—环境安装、判断、循环语句等(爬虫及数据可视化) 1. 课程介绍1.1 相关内容1.2 学习目标1.3 学习内容安排 2. python2.1 环境配置2.2 标识符和关键字2.3 运算符2.4 判断语句2.5 循环语句 1. 课程介绍 1.1 相关内容 10天的…

Node.js安装及配置

文章目录 1.安装Node.js2.创建目录3.配置环境变量4.配置全局安装路径和缓存路径(可选)配置Webstorm 1.安装Node.js https://registry.npmmirror.com/binary.html?pathnode 推荐安装18.x版本 2.创建目录 下载解压后进入目录,创建node_global和node_cache两个空文…

AI播客下载:Practical AI(人工智能最新进展)

Practical AI这是由 http://Changelog.com推出的节目。Changelog 本身做了许多跟软件开发的 podcast 节目 。比如《The Changelog》播客 ,这是一个专注于软件领域的播客,每周一发布最新新闻摘要,周三进行深入技术访谈,周五则是访谈…

Vue-element 组件dialog右上角点击 X 清空表单校验信息

问题: 点击确定触发校验后,点击弹窗右上角的 X号关闭弹窗后再次打开弹窗,校验规则没有被清空 解决方法:

Linux——数据流和重定向,制作镜像

1. 数据流 标准输入( standard input ,简称 stdin ):默认情况下,标准输入指从键盘获取的输入 标准输出( standard output ,简称 stdout ):默认情况下,命令…

每日复盘-20240701

今日关注: 20240701 六日涨幅最大: ------1--------301182--------- 凯旺科技 五日涨幅最大: ------1--------300977--------- 深圳瑞捷 四日涨幅最大: ------1--------300977--------- 深圳瑞捷 三日涨幅最大: ------1--------300461--------- 田中精机 二日涨幅最…

迈阿密色主题学科 HTML5静态导航源码

源码介绍 迈阿密色主题学科 HTML5静态导航源码,源码直接上传可用,有技术的可以拿去写个后端搜索调用百度接口,也可用于做引导页下面加你网址添加一个A标签就行了,很简单,需要的朋友就拿去吧 界面预览 源码下载 迈阿…

nginx限制特定国家或地区的访问

一、查看 1. 先查看本地nginx是否有ngx_http_geoip2模块(如果有的同学有该模块可以直接跳到下面直接配置nginx服务) nginx -V 二、安装 1. 安装所需依赖 yum install -y libmaxminddb-devel pcre-devel zlib-devel gcc gcc-c make git 2. 下载ngx_h…

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output:指定导出文件的路径和名称[镜像名称[:标签]]:导出镜像名称以及可选的标签 dock…

Web2Code :网页理解和代码生成能力的评估框架

多模态大型语言模型(MLLMs)在过去几年中取得了爆炸性的增长。利用大型语言模型(LLMs)中丰富的常识知识,MLLMs在处理和推理各种模态(如图像、视频和音频)方面表现出色,涵盖了识别、推…

修改element-ui日期下拉框datetimePicker的背景色样式

如图: 1、修改背景色 .el-date-picker.has-sidebar.has-time { background: #04308D; color: #fff; border: 1px solid #326AFF } .el-date-picker__header-label { color: #ffffff; } .el-date-table th { color: #fff; } .el-icon-d-arrow-left:before { color: …

【机器学习】基于层次的聚类方法:理论与实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 基于层次的聚类方法:理论与实践引言1. 层次聚类基础1.1 概述1.2 距离…

新质生产力最新测算(Shp/dta/xcel格式,2012-2022年)

数据简介:参考学者蔡湘杰、贺正楚的做法、我们通过收集数据构建了如下所示的衡量新质生产力的指标体系,但部分数据由于收集难度以及未公布等问题,部分数据有缺少,下面展示了部分原始数据,便于大家进行分析。 数据来源…

自动测域名延迟的导航页面源码

好看导航页面可自动测域名延迟,该源码是html源码,可以做个引导页面,需要的朋友可以下载使用 自动测域名延迟的导航页面源码

如何优化前端性能:提高网页加载速度的实用技巧

我们在前端开发中,性能优化是提高用户体验的关键因素。网页加载速度直接影响用户的满意度和留存率。本文将介绍几种优化前端性能的实用方法,帮助你提高网页加载速度。 问题描述 : 首先前端性能优化涉及多个方面,包括减少HTTP请…

QueryClientProvider is not defined

QueryClientProvider is not defined 运行一个svelte的项目,报错如上,前后查找解决不了,然后没办法, 本来是用yarn 安装的依赖,改用npm install,再次运行就成功了

全国产化飞腾模块BIOS下修复系统启动文件

1、背景介绍 全国产飞腾模块采用麒麟信安操作系统,当系统下面的grub.cfg文件被用户误操作导致无法启动时,可以在BIOS下通过U盘中备份的grub.cfg替换硬盘上原来的grub.cfg文件,从而实现启动。 2、操作步骤 首先进入BIOS命令行模式&#xff…

【Linux系列】Fedora40安装VMware Workstation Pro报错

问题描述 由于Fedora 40使用的Linux内核是6.9,导致安装VMware Workstation Pro 时,安装依赖无法成功,具体报错如下 ..................CC [M] /tmp/modconfig-a8Fcf5/vmnet-only/smac.oCC [M] /tmp/modconfig-a8Fcf5/vmnet-only/vnetEvent.oCC [M] …

【避雷实测】宠物空气净化器怎么选?希喂、小米、安德迈谁更值得入手!

不知道家里养猫的朋友们有没有注意到,每逢春夏季节,无论是户外还是室内,我们的鼻子常常感到痒痒的。户外的痒感往往是因为那些飘散的杨柳絮,而在室内,这种痒感很可能是由于猫主子的毛发飘浮在空气中所引起的。 为了能…

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

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