RocketMQ概论

news/2024/4/29 16:38:26/文章来源:https://blog.csdn.net/Joker_ZJN/article/details/131993079

目录

前言:

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.luyixian.cn/news_show_337151.aspx

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

相关文章

四种刷题模式的爱刷题无后端无数据库刷题应用网站H5源码

四种刷题模式的爱刷题无后端无数据库刷题应用网站H5源码。提供了简单轻量化的部署方式和详细的四种刷题模式教程。该应用使用JSON作为题库的存储方式,层次清晰、结构简单易懂。 配套的word模板和模板到JSON转换工具可供使用,方便将题库从word格式转换为…

抖音seo短视频账号矩阵系统技术开发简述

说明:本开发文档适用于抖音seo源码开发,抖音矩阵系统开发,短视频seo源码开发,短视频矩阵系统源码开发 一、 抖音seo短视频矩阵系统开发包括 抖音seo短视频账号矩阵系统的技术开发主要包括以下几个方面: 1.前端界面设…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中,IOC(Inversion of Control)和DI(Dependency Injection)是密切相关的概念。 IOC(控制反转&a…

【每日一题】141. 环形链表

【每日一题】141. 环形链表 【每日一题】141. 环形链表题目描述解题思路 【每日一题】141. 环形链表 题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环…

37 coredump 的生成和使用

前言 呵呵 coredump 之前对于我而言也是一个挺陌生的概念 但是 只从开始了 linux 的相关学习之后, 对于这个 概念也有了一些 理解 呵呵 这里 以一些 简单的例子 来看一下 coredump 的生成和使用 首先执行 "ulimit -c unlimited" 测试用例1 - 除数为 0 root…

【TypeScript】TS入门级基础学习(一)

【TypeScript】TS入门级基础学习(一) 一、前言 TypeScript 是一种用于应用程序规模的 JavaScript 语言。 TypeScript 向 JavaScript 添加了可选类型,支持用于任何浏览器、任何主机、任何操作系统的大规模 JavaScript 应用程序的工具。 Type…

Spark(37):Streaming DataFrame 和 Streaming DataSet 创建

目录 0. 相关文章链接 1. 概述 2. socket source 3. file source 3.1. 读取普通文件夹内的文件 3.2. 读取自动分区的文件夹内的文件 4. kafka source 4.1. 导入依赖 4.2. 以 Streaming 模式创建 Kafka 工作流 4.3. 通过 Batch 模式创建 Kafka 工作流 5. Rate Source…

2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意: 给定长度为n的数列,要求每个数都在的范围,且任意长度大于等于2的区间和都大于等于0,问方案数。。 思路: 首先要看出是dp题,用来表示遍历到第i位且后缀和最小为x的可行方案数(此时的后缀可以只有最…

Java 版 spring cloud +spring boot 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

linux下nginx的安装和使用

文章目录 📒安装nginx正常使用nginx包安装1️⃣上传到对应目录2️⃣解压nginx3️⃣检查是否启动成功 使用docker安装nginx 📒使用nginx1️⃣简单的反向代理2️⃣介绍location配置中root和alias的区别 📒安装nginx 正常使用nginx包安装 官网…

BLE基础理论/Android BLE开发示例

参考:https://blog.csdn.net/qq_36075612/article/details/127739150?spm1001.2014.3001.5502 参考: https://blog.csdn.net/qq_36075612/article/details/122772966?spm1001.2014.3001.5502 目录 蓝牙的分类传统蓝牙低功耗蓝牙 蓝牙专业词汇&#xff…

SpringAOP的相关概念

文章目录 一.什么是AOP二.AOP的组成部分三.SpringAOP的实现3.1 增加SpringAOP依赖3.2 创建切面3.2 创建切点3.3 创建通知3.4 创建连接点 四.SpringAOP的实现原理4.1 JDK动态代理4.2 CGLIB 动态代理总结 一.什么是AOP AOP,全称为Aspect-Oriented Programming&#x…

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述: ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…

新零售行业如何做会员管理和会员营销

蚓链数字化营销系统全渠道会员管理解决方案,线上线下统一管理,打造私域流量,微信、门店会员全渠道管理,打通私域流量池,实现裂变营销: 开启新零售之路,必然要摒弃原有的管理模式,大…

郑州多域名https证书

多域名https证书是https证书中比较特殊的一款,它保护的域名记录是众多https证书中最灵活的。不管是DV基础型的多域名https证书还是OV企业型和EV增强型的多域名https证书既可以保护多个主域名或者子域名,还可以主域名子域名随意组合,只要申请者…

【动态规划part11】| 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

目录 🎈LeetCode123.买卖股票的最佳时机III 🎈LeetCode188.买卖股票的最佳时机IV 🎈LeetCode123.买卖股票的最佳时机III 链接:123.买卖股票的最佳时机III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i…

无涯教程-jQuery - Pulsate方法函数

Pulsate 效果可以与effect()方法一起使用。这会使元素的不透明性产生多次脉冲。 Pulsate - 语法 selector.effect( "pulsate", {arguments}, speed ); 这是所有参数的描述- times - 脉动的时间。默认值为3。model - 效果的模式。可以是"显示(show)"&a…

基于Java+SpringBoot+vue前后端分离技术交流和分享平台设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Moke 一百万条 Mysql 的数据

文章目录 前言创建数据库创建表结构生成数据 前言 想研究一下,数据量大的情况下,如何优化前端分页,所以需要 Moke 一些数据 创建数据库 在 Mysql的基础上,可以写个语句执行 CREATE DATABASE test_oneMillion; USE test_oneMi…

JAVA SE -- 第十一天

(全部来自“韩顺平教育”) 异常-Exception 一、异常介绍 1、基本介绍 Java语言中,将程序执行中发生的不正常情况为“异常”(开发过程中的语法错误和逻辑错误不是异常) 2、执行过程中发生的异常事件可分为两大类 …