大聪明教你学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 😎

小结

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

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

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

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

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

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

相关文章

YOLOv10改进教程|C2f-CIB加入注意力机制

一、 导读 论文链接:https://arxiv.org/abs/2311.11587 代码链接:GitHub - CV-ZhangXin/AKConv YOLOv10训练、验证及推理教程 二、 C2f-CIB加入注意力机制 2.1 复制代码 打开ultralytics->nn->modules->block.py文件,复制SE注意力机…

Docker期末复习

云计算服务类型有: IaaS 基础设施及服务 PaaS 平台及服务 SaaS 软件及服务 服务类型辨析示例: IaaS 服务提供的云服务器软件到操作系统,具体应用软件自己安装,如腾讯云上申请的云服务器等;SaaS提供的服务就是具体的软件,例如微软的Office套件等。 云计算部署模式有: 私有云…

发那科机床采集数据

前面两篇重点介绍了理论,从这篇开始,我们开始进行实战。首先从发那科机床开始,为何第一个将发那科。因为发那科系统机床有三最。最广泛(中国保有量最多)、 最多资料(发那科系统的开发包历史悠久&#xff0c…

Linux——移动文件或目录,查找文件,which命令

移动文件或目录 作用 - mv命令用于剪切或重命名文件 格式 bash mv [选项] 源文件名称 目标文件名称 注意 - 剪切操作不同于复制操作,因为它会把源文件删除掉,只保留剪切后的文件。 - 如果在同一个目录中将某个文件剪切后还粘贴到当前目录下,…

CS144 Lab3 TCPSender复盘

一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流(ByteStream),底层使用std::deque实现,根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区,用户…

江协科技51单片机学习- p23 DS1302实时时钟

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

巴比达内网穿透:深度剖析其在解决远程连接挑战中的技术优势

在信息技术日新月异的今天,远程协作与管理的需求日益增长,但内网环境的隔离性一直是横亘在高效远程操作面前的一道坎。本文将深入探讨一款专为打破此壁垒而生的工具——巴比达内网穿透,如何以其技术创新和高效性能,成为解决远程连…

汽车内饰塑料件光照老化实验箱

塑料件光照老化实验箱概述 塑料件光照老化实验箱,又称为氙灯老化试验箱,是一种模拟自然光照条件下塑料材料老化情况的实验设备。它通过内置的氙灯或其他光源,产生接近自然光的紫外线辐射,以此来加速塑料及其他材料的光老化过程。…

数据挖掘常见算法(分类算法)

K-近邻算法(KNN) K-近邻分类法的基本思想:通过计算每个训练数据到待分类元组Zu的距离,取和待分类元组距离最近的K个训练数据,K个数据中哪个类别的训练数据占多数,则待分类元组Zu就属于哪个类别…

Python + OpenCV 酷游地址教学V鄋KWK3589

本篇文章汇整了一系列的Python OpenCV 教学,只要按照教学文的顺序阅读和实作,就可以轻松入门OpenCV,并透过OpenCV 实现许多影像相关的创意应用。 接下来我们来介绍OpenCV-- OpenCV 是一个跨平台的电脑视觉函式库( 模组) ,可应用…

Python容器 之 字符串--字符串的常用操作方法

1.字符串查找方法 find() 说明:被查找字符是否存在于当前字符串中。 格式:字符串.find(被查找字符) 结果:如果存在则返回第一次出现 被查找字符位置的下标 如果不存在则返回 -1 需求: 1. 现有字符串数据: 我是中国人 2. 请设计程序…

Gavin大咖亲自授课:将大语言模型与直接偏好优化对齐

Gavin大咖亲自授课:将大语言模型与直接偏好优化对齐 Align LLMs with Direct Preference Optimization 直接偏好优化( Direct Preference Optimization)这绝对是天才性的算法。你会看到数学的巨大力量和巨大价值,你一定会很兴奋和…

【计算机网络期末复习】例题汇总(一)

重点例题选择填空简答题与传输媒体的接口的特性重点 计算机网络的性能指标计算机网络体系结构例题 选择

Linux高并发服务器开发(八)Socket和TCP

文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点:出错重传 每次发送数据对方都会回ACK,可靠 tcp是打电话的模型,建立连接 使用连接 关闭连接…

泛微E9开发 根据故障来源新增明细行,并且初始化错误类型

根据故障来源新增明细行,并且初始化错误类型 1、需求说明2、实现方法3、扩展知识点3.1 批量修改字段值或显示属性3.1.1 格式3.1.2 参数3.1.3 演示 3.2 根据字段ID获取字段信息3.2.1 格式3.2.2 参数3.2.3 演示 1、需求说明 用户对出现故障的机器或设备进行判断问题判…

C++进阶 | [4.3] 红黑树

摘要:什么是红黑树,模拟实现红黑树 红黑树 ,是一种 二叉搜索树 ,但 在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树…

分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验

前言 在有些比较消耗时间的业务场景中,比如生成报表等,如果没有在操作的过程中向用户反馈操作进度,会让用户以为程序 “死” 掉了,用户体验非常不好。 WinForm 桌面程序项目与 Console 项目不一样,如果 Console 项目…

【C++】红黑树及其实现

目录 一、红黑树的定义1.为什么提出红黑树?2.红黑树的概念3.红黑树的性质 二、红黑树的实现1.红黑树的结构2.红黑树的插入2.1 uncle为红色2.2 uncle为黑色,且是grandfather的右孩子2.3 uncle为黑色,且是grandfather的左孩子 3.红黑树的验证 4…

虚拟机网络配置(静态网络)

解决问题:VMware中创建centOS虚拟机后使用ifconfig没有ip地址,但我想在主机(Windows)系统下使用shell连接虚拟机从而方便后续交互。 VMware中编辑->虚拟网络编辑器 (注意需要管理员身份不然会无法修改)…

PV操作经典例题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、前言🚀🚀🚀二、正文☀️☀️☀️三、总结🍓🍓🍓 一、前言🚀🚀&am…