RocketMQ概论

目录

前言:

1.概述

2.下载安装、集群搭建

3.消息模型

4.如何保证吞吐量

4.1.消息存储

4.1.1顺序读写

4.1.2.异步刷盘

4.1.3.零拷贝

4.2.网络传输


前言:

RocketMQ的代码示例在安装目录下有全套详细demo,所以本文不侧重于讲API这种死的东西,而是侧重于讲解RocketMQ的特性。消息中间件无非需要关注三点:吞吐量、消息可靠性、消息模型。任何消息中间件的异同点就体现在这三个方面。本文也会从这三个方面来讲解RocketMQ。

本文是作者RocketMQ系列文章的最后一篇,一些基础的概念、下载安装、集群、基本消息模型等,前面都已经有单独的文章讲过,每篇都很深入浅出,单篇阅读花不了两三分钟,所以这些内容会直接贴上链接。

1.概述

RocketMQ 是一款开源的分布式消息中间件,最初由阿里巴巴集团开发并开源。它旨在为分布式系统提供可靠、高性能、可扩展的消息通信能力。RocketMQ和RabbitMQ、KAFKA一起并列为现在主流的三大消息中间件。

RocketMQ的基本概念+架构:

RocketMQ基础概念__BugMan的博客-CSDN博客

2.下载安装、集群搭建

RocketMQ的下载安装教程+集群搭建教程:

RocketMQ下载安装、集群搭建保姆级教程_安装rocketmq集群__BugMan的博客-CSDN博客

3.消息模型

RocketMQ的消息模型有以下几种:

  • 顺序消息,消费者按照生产者的发送顺序进行消费。
  • 广播消息,一条消息被多个消费者消费。
  • 延迟消息,驻留时间,消费者才能消费到消息。
  • 批量消息,支持生产者批量发送消息。
  • 过滤消息,通过tag,消费者可以消费同一个topic下自己感兴趣的消息。
  • 事务消息,生产者的消息生产支持事务回退。

RocketMQ消息模型详解:

详解RocketMQ使用__BugMan的博客-CSDN博客

4.如何保证吞吐量

4.1.消息存储

RocketMQ最大的特点概括起来其实就一句话:

既保证了消息的可靠性,又保证了吞吐量。

可靠性和吞吐量其实是互斥的两点,为了保证可靠性,消息就一定要落在磁盘存储防止断电丢失。落在磁盘存储后,读这条消息的时候的磁盘IO就会拉低吞吐量。所以RocketMQ的核心其实就是数据落磁盘,然后想尽一切办法来提高吞吐量。

RocketMQ的生产消费过程:

  • 收到生产者发送的消息,将其存起来

  • 向消费者推送一条消息后,等待消费者的ACK,收到ACK后将消息标记为已消费。

  • 定期删除一些已经过期的消息。

RocketMQ用来提高吞吐量的手段:

  • 顺序写

  • 异步刷盘

  • 零拷贝

4.1.1顺序读写

磁盘的顺序读写性能要远好于随机读写。因为每次从磁盘读数据时需要先寻址,找到数据在磁盘上的物理位置。对于机械硬盘来说,就是移动磁头,会消耗时间。 顺序读写相比于随机读写省去了大部分的寻址时间,它只需要寻址一次就可以连续读写下去,所以性能比随机读写好很多。

RocketMQ 利用了这个特性。它所有的消息数据都存放在一个无限增长的文件队列 CommitLog 中,CommitLog 是由一组 1G 内存映射文件队列组成的。 写入时就从一个固定位置一直写下去,一个文件写满了就开启一个新文件顺序读写下去。

RocketMQ顺序写盘的过程如下:

  1. 生产者发送消息到 RocketMQ Broker。Broker 接收到消息后,将消息按照顺序写入内存中的 Page Cache(页面缓存)中。

  2. 消息在内存的 Page Cache 中形成连续的数据块。由于 RocketMQ 的顺序写盘策略,相同 Topic 和 Queue ID 的消息会按照发送的先后顺序排列成一批,形成连续的数据块,而不是随机地散落在磁盘上。

  3. 然后,后台线程会定期将 Page Cache 中的连续数据块顺序写入磁盘上的存储文件中,称为 "CommitLog"。由于数据是连续写入,因此磁盘的写入操作变得高效,减少了寻道时间和磁盘的碎片化,提高了写入性能。

需要注意的是,顺序写盘并不是说所有消息都按照先后顺序写入,而是相同 Topic 和 Queue ID 的消息会按照发送的先后顺序形成连续的数据块写入磁盘。对于不同 Topic 和 Queue ID 的消息,它们可能在磁盘上是交错存储的。

4.1.2.异步刷盘

RocketMQ 的异步刷盘(Async Flush)是一种优化手段,用于提高消息的写入性能和吞吐量。在消息存储上,RocketMQ 遵循了写入先落盘再返回的策略,即在消息写入磁盘之前,会先将消息写入操作系统的 Page Cache(页面缓存)中,并立即返回写入成功的响应给生产者,然后由后台线程异步地将 Page Cache 中的数据刷写到磁盘中。

4.1.3.零拷贝

零拷贝(Zero-Copy)是一种优化技术,旨在提高数据传输的效率和性能,特别是在文件传输和网络数据传输中。传统的数据传输方式涉及多次数据拷贝,而零拷贝通过避免不必要的数据拷贝操作,减少了数据传输的开销,从而提高系统的性能。

在传统的数据传输中,例如从磁盘读取文件并通过网络发送,通常涉及以下步骤:

  1. 将数据从磁盘读取到内核空间(Kernel Buffer)。
  2. 将数据从内核空间拷贝到用户空间(User Buffer)。
  3. 将数据从用户空间拷贝到网络缓冲区(Network Buffer)。
  4. 最终数据通过网络发送。

这种传统的数据传输方式涉及多次数据拷贝,每次拷贝都需要 CPU 参与,并且需要在内核空间和用户空间之间进行数据复制,导致了额外的开销和延迟。

零拷贝技术的主要思想是避免不必要的数据拷贝,通过直接在内核空间和用户空间之间传输数据,从而减少 CPU 和内存的使用。

关于0拷贝更详细的内容异步博主的另一篇文章:

全网最清晰的零拷贝详解,看一遍就会__BugMan的博客-CSDN博客

4.2.网络传输

关于序列化,以及为什么要用序列化,不是很清楚的同学可以移步博主的另一篇文章:

详解JAVA序列化__BugMan的博客-CSDN博客

RocketMQ的报文使用了序列化,序列化和反序列化由生产者端和消费者端的SDK来实现。

RocketMQ目前支持的序列化方式有:

  1. RocketMQ 自定义序列化:RocketMQ 使用自定义的序列化协议进行消息的编码和解码。这个序列化协议被称为 Remoting Command Protocol。该协议采用了二进制格式,对消息进行高效的编解码处理,以实现高性能和低延迟。

  2. JSON 序列化:RocketMQ 支持将消息转换为 JSON 格式进行传输。JSON 序列化方式适合处理复杂结构的消息,易于阅读和调试,但相比二进制格式会增加一定的传输开销。

  3. Java 原生序列化:RocketMQ 还支持使用 Java 原生的序列化方式(Java Serialization)。Java 原生序列化是 Java 标准库提供的一种序列化方式,但在性能方面可能不如其他序列化框架。

  4. Hessian 序列化:Hessian 是一种二进制序列化框架,支持多种编程语言。RocketMQ 支持使用 Hessian 将消息序列化为二进制数据进行传输。

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

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

相关文章

数据结构:快速的Redis有哪些慢操作?

redis 为什么要这莫快?一个就是他是基于内存的,另外一个就是他是他的数据结构 说到这儿,你肯定会说:“这个我知道,不就是 String(字符串)、List(列表)、 Hash&#xff08…

1.Ansible

文章目录 Ansible概念作用特性总结 部署AnsibleAnsible模块commandshellcronusergroupcopyfilehostnamepingyumserice/systemdscriptmountarchiveunarchivereplacesetup inventory主机清单主机变量组变量组嵌套 Ansible 概念 Ansible是一个基于Python开发的配置管理和应用部署…

数据结构:分块查找

分块查找,也叫索引顺序查找,算法实现除了需要查找表本身之外,还需要根据查找表建立一个索引表。例如图 1,给定一个查找表,其对应的索引表如图所示: 图 1 查找表及其对应的索引表 图 1 中,查找表…

安装Anaconda3和MiniConda3

MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包,请安装Anaconda。MiniConda3官方版还是一个开源的软件包管理系统和环境管理系统,能够帮助用户安装多个版本的软件…

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type="file" @change="handleFileChange" /&…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵&#xff0c;若的特征值为&#xff0c;则称为矩阵的奇异值。 0.2 SVD(分解)定理 设&#xff0c;则…

神经网络简单介绍

人工神经网络(artififial neural network) 简称神经网络&#xff0c;它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息&#xff0c;再通过隐藏层进行特征信息的加工和提取&#xff0c;最后通过输出层输出结果。 根据需要神经网络可以…

RTPSv2.2(中文版)

实时发布订阅协议 &#xff08;RTPS&#xff09; DDS互操作性 有线协议规范 V2.2 &#xff08;2014-09-01正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.2/PDF 目 录 1 范围Scope 9 2 一致性Conformance 9 3 参考文献References 9 4 术语和定义Terms a…

centos(linux)手动配置ip地址

查看系统 查看ip 进入网卡配置的目录 [root178-119-30-16 ~]# cd /etc/sysconfig/network-scripts/ [root178-119-30-16 network-scripts]# ls ifcfg-ens192 ifdown ifdown-ippp ifdown-post ifdown-sit ifdown-tunnel ifup-bnep ifup-ipv6 ifup-plus…

【Mysql】万字长文带你快速掌握数据库基础概念及SQL基本操作

文章目录 前言一、数据库相关概念1. 什么是数据库2. 数据库的种类3. Mysql 简介4. SQL简介5. 数据库中常见的数据类型 二、SQL基础1. SQL通用语法2. SQL的主要分类3. DDL&#xff08;数据库&#xff0c;表&#xff0c;索引&#xff0c;视图&#xff09;4. DML&#xff08;数据的…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【每日一题】—— A - 1-2-4 Test (AtCoder Beginner Contest 270)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

HiveSQL SparkSQL中常用知识点记录

目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

list与erase()

运行代码&#xff1a; //list与erase() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}friend istr…

JMM是如何保证原子性呢?

3.3.1加锁 锁是一种通用技术&#xff0c;比如Java提供的Synchronized关键字就是锁的一种实现&#xff0c;Synchronized是排他锁/独占锁&#xff0c;就是有你没我的意思&#xff0c;只要其他线程到来访问&#xff0c;发现锁还未释放&#xff0c;就要在外面等待&#xff0c;因为S…

Redis—相关背景

Redis—相关背景 &#x1f50e;Redis—特性In-memory data structures—在内存中存储数据Programmability—可编程性Extensibility—可扩展性Persistence—持久化Clustering—集群High availability—高可用 &#x1f50e;Redis 为什么快&#x1f50e;Redis 的使用场景Real-tim…

【TiDB理论知识06】PD架构与作用

目录 一 PD的架构与功能 PD架构 PD作用 名词解释 路由功能 二 TSO的分配 概念 分配过程 性能问题 高可用问题 三 PD的调度原理 总流程 1 信息收集 2 生成调度 3 执行调度 四 Label的作用 Label的配置 给TiKV打标签 PD配置 一 PD的架构与功能 PD架构 PD集群…

学习Maven Web 应用

Maven Web 应用 本章节我们将学习如何使用版本控制系统 Maven 来管理一个基于 web 的项目&#xff0c;如何创建、构建、部署已经运行一个 web 应用。 创建 Web 应用 我们可以使用 maven-archetype-webapp 插件来创建一个简单的 Java web 应用。 打开命令控制台&#xff0c;…