RocketMQ-存储与弹性伸缩

存储与弹性伸缩

  • 一、介绍
  • 二、存储架构图
    • 1.CommitLog
    • 2.ConsumeQueue
    • 3.IndexFile
  • 三、消息读写流程
    • 1.写入流程
      • 1.1 获取Topic元数据
      • 1.2 消息投递
      • 1.3 消息写入
    • 2.读取流程
      • 2.1 获取Topic元数据
      • 2.2 消息拉取
      • 2.3 消息消费
  • 四、消息持久化
    • 1.页缓存
    • 2.刷盘
      • 2.1 同步刷盘
      • 2.2 异步刷盘
  • 五、集群模式
    • 1.单Master模式
    • 2.多Master模式
    • 3.多Master多Slave模式-异步复制
    • 4.多Master多Slave模式-同步双写
  • 六、弹性伸缩
    • 1.NameServer
    • 2.Broker
      • 2.1 ConsumerQueue伸缩
      • 2.2 Broker伸缩
    • 3.Producer
    • 4.Consumer
  • 总结
  • 参考链接


一、介绍

主要是对RocketMQ的存储与弹性伸缩做一个学习和总结、加深印象。内容参考RocketMQ官方文档。

二、存储架构图

RocketMQ采用的是混合型存储结构,单个Broker实例将负责的所有队列用同一个日志数据文件(CommiLog)存储。
在这里插入图片描述

1.CommitLog

保存消息主体以及元数据,存储Producer端写入的消息主体内容。Broker负责的多个Topic的消息实体内容都存储于一个commitLog中。消息顺序写入commitLog文件,当文件满了,写入到下一个文件。

2.ConsumeQueue

消息消费队列类似kafka中的Topic下的分区,主要是为了提高消息消费的性能。针对主题消费不需要遍历commitLog文件并检索出对应topic消息。ConsumeQueue并不会保存消息主体内容,保存的主要是消息在CommitLog中的物理偏移量offset、消息的大小size、消息Tag的HashCode值。

3.IndexFile

提供一种可以通过key或者时间区间来查询消息的方法。

三、消息读写流程

1.写入流程

在这里插入图片描述

1.1 获取Topic元数据

  • 1.Producer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Producer获取topic元数据信息

1.2 消息投递

  • 3.Producer根据元数据信息选择Broker和需要投递的队列
  • 4.Producer发起远程请求投递消息到Broker

1.3 消息写入

  • 5.Broker将消息写入到CommitLog文件
  • 6.ReputMessageService异步读取CommitLog信息
  • 7.ReputMessageService根据消息的topic和队列信息,将消息的offset、size、消息Tag的HashCode值写入到对应队列

2.读取流程

在这里插入图片描述

2.1 获取Topic元数据

  • 1.Consumer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Consumer获取topic元数据信息

2.2 消息拉取

  • 3.Consumer根据元数据信息选择Broker和需要消费的队列
  • 4.Consumer发起远程消费请求到Broker

2.3 消息消费

  • 5.Broker根据上次Offset从消费队列查找消息检索信息
  • 6.Broker从CommitLog查询到消息主体,然后返回消息主体信息给Consumer

四、消息持久化

对于单个Broker的消息持久化,主要是需要知道OS对文件的缓存和刷盘机制。如果只选择单个机器模式,一旦Broker重启或宕机会导致服务不可用,Broker磁盘损坏也会导致消息丢失,所以需要选择适合的机器模式来解决单点故障。

1.页缓存

操作系统为了加速对文件的读写,采用了页缓存机制(PageCache)。对于数据的写入,OS会先将内容写入到Cache内,随后才会将Cache内的数据刷盘至物理磁盘上。对于数据的读取,如果一次读取文件时未命中PageCache,OS会从物理磁盘上读取文件并加载到PageCache。
RocketMQ采用混合存储,ConsumerQueue逻辑消费队列存储内容比较少,而CommitLog存储所有Topic信息主体,也就是文件数量不会随着Topic线性增长,可以充分利用页缓存机制来加快消息的消费和写入。

2.刷盘

消息发送到Broker后,是先写入到OS内存,然后将内存中数据刷盘到物理磁盘,才能保证消息不丢失。

2.1 同步刷盘

同步刷盘是指只有Broker将消息持久化到磁盘后,Broker端才会返回给Producer端一个ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障。

2.2 异步刷盘

异步刷盘是指只要Broker将消息写入到PageCache,Broker端就会返回Producer端一个ACK响应。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量。

五、集群模式

1.单Master模式

单个Master一旦Broker重启或者宕机时,会导致服务不可用,不建议生产环境使用。

2.多Master模式

一个集群全是Master,配置简单,单个Maste宕机或重启对应用无影响。但是宕机机器在恢复之前,消息无法消费。

3.多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,采用异步复制方式,主备有短暂消息延迟(毫秒级)

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

4.多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,采用同步双写方式,即只有主备都写成功,才向应用返回成功。

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点:性能比异步复制模式略低,发送单个消息的RT会略高

六、弹性伸缩

1.NameServer

通过HTTP服务来设置NameServer地址,可以支持动态增加NameServer。

2.Broker

2.1 ConsumerQueue伸缩

如果消息积压并且Consumer实例数量已经提升到与消息队列一致的情况下,可以通过同步增加ConsumerQueue与Consumer实例数量来减少消息的积压。增加ConsumerQueue后会触发所有Consumer实例的负载均衡。

2.2 Broker伸缩

如果Broker有性能瓶颈,可以通过新增Broker。在新的Broker进行新Topic创建或者已有Topic消费队列的创建来分担原有Broker的压力。

3.Producer

Producer发送消息的时候,默认会轮询消费队列进行消息发送。新增的Producer会从NameServer获取Topic的元数据从而选择对应的消费队列进行消息发送,删除的Producer不会有任何影响。

4.Consumer

在集群消费模式下,如果消费能力不足,可以通过增加消费组下的Consumer实例来增加消费能力。但是此模式下,每个消费队列只能由消费组下的一个Consumer实例来进行消费,也就是如果消费实例数量大于消费队列数量的消费实例不会进行消费,属于浪费资源。
消费组下的Consumer实例增加或者减少都会触发所有实例的负载均衡,将消费队列分配到对应的Consumer实例。

总结

RocketMQ采用的是混合存储,将Broker上的所有Topic信息主体保存到同一个文件中。特别适合内部消息队列的场景,即Topic数量多、但是每个Topic的消息量较少的场景。采用多种集群部署模式,可以适用多种可靠性场景。具有很强的弹性伸缩能力来满足业务波动的场景。


参考链接

1.RocketMQ存储架构
2.GitHub RocketMQ中文文档
3.Apache RocketMQ开发者指南
4.Apache RocketMQ 集群部署

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

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

相关文章

【python】异常处理

前言 省略各种废话,直接快速整理知识点 try-except 基础 作用 程序不可能永远都是对的,当7除a,a由用户输入时,用户输入0就会报错。try-except就是解决这些问题。 结构 多分支自定义错误类型 上方的exception是一个错误类型…

基于Kronig-Penney能带模型的MATLAB求解与仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Kronig-Penney能带模型的MATLAB求解与仿真.综合利用 MATLAB提供的求解常微分方程、矩阵行列式、代数表达式化简及绘图等函数 ,可使 Kronig-Penney能带模型分析…

c语言,大宗撮合交易中心系统核心模块代码

撮合交易系统(Matching System)常用于大宗交易,如股票、期货等市场,它负责根据买卖双方的报价和数量,自动撮合成交。撮合系统的核心模块通常包括订单管理、价格计算和撮合逻辑等部分。 由于撮合系统的实现复杂且依赖于…

R语言更新版本

目录 一、更新R语言 1、安装最新的R语言版本 2、移动之前安装的packages 3、将Rstudio连接到最新的R语言 二、Rstudio更新 一、更新R语言 1、安装最新的R语言版本 查看当前R语言版本: R.version.string 下载最新的R语言安装包:R: The R Project…

详解数据库、Hive以及Hadoop之间的关系

1.数据库: 数据库是一个用于存储和管理数据的系统。数据库管理系统(DBMS)是用于管理数据库的软件。数据库使用表和字段的结构来组织和存储数据。关系型数据库是最常见的数据库类型,使用SQL(Structured Query Language…

文献阅读:DEA-Net:基于细节增强卷积和内容引导注意的单图像去雾

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读:DEA-Net:基于细节增强卷积和内容引导注意的单图像去雾1、研究背景2、方法提出3、相关知识3.1、DEConv3.3、多重卷积的…

C#快速入门基础

本篇文章从最基础的C#编程开始学习,经过非常优秀的面向对象编程思想和方法的学习,为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU(建议 4核 4线程或以上 &#xff0…

第五十四回 高太尉大兴三路兵 呼延灼摆布连环马-AI通过构建并训练CNN网络来进行飞机识别

呼延灼举荐了百胜将韩滔和天目将彭玘做先锋。 两军对战,韩滔和秦明斗二十回合,呼延灼与林冲斗在一起,花荣与彭玘斗在一处,后彭玘与一丈青扈三娘斗在一起,被扈三娘抓住。 尽管梁山占优,宋江也没有乘胜追击&…

this.$set,更新vue视图

this.$set(this.searchForm, age, 30) // 对象 this.$set(this.searchForm1, 0, { name: 汪汪, age: 11, content: 擅长口算 })// 数组

帮管客CRM jiliyu接口存在SQL漏洞 附POC软件

免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 1. 帮管客CRM简介 微信公众号搜索:南风漏洞复现文库…

如何配置IDEA中的JavaWeb环境(2023最新版)

创建项目 中文版:【文件】-【新建】-【项目】 点击【新建项目】,改好【名称】点击【创建】 右键自己建立的项目-【添加框架支持】(英文版是Add Framework Support...) 勾选【Web应用程序】-【确定】 配置tomcat 点击编辑配置 点…

人民网发稿多少钱?媒介多多告诉你答案!附人民网各频道报价表

你是否也想知道在人民网发稿需要多少钱?媒介多多告诉你答案!人民网是国内权威新闻平台之一,拥有大量忠实读者群体。想要在人民网上发稿进行推广,是很多企业和个人的选择。那么,人民网发稿到底需要多少钱呢?…

云计算,用价格让利换创新空间?

文 | 智能相对论 作者 | 李源 ECS(云服务器)最高降36%、OSS(对象存储)最高降55%、RDS(云数据库)最高降40%…… 阿里云惊人的降幅,一次性把国内云计算厂商的价格战推到了白热化阶段。 这次能…

魔众智能AI系统v2.1.0版本支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini)

支持主流大模型(讯飞星火、文心一言、通义千问、腾讯混元、Azure、MiniMax、Gemini) [新功能] 系统全局消息提示 UI 全新优化 [新功能] JS 库增加【ijs】类型字符串,支持默认可执行代码 [新功能] 分类快捷操作工具类 CategoryUtil [新功能…

接口自动化测试从入门到高级实战!

接口测试背景和必要性 接口测试是测试系统组件间接口(API)的一种测试,主要用于检测内部与外部系统、内部子系统之间的交互质量,其测试重点是检查数据交换、传递的准确性,控制和交互管理过程,以及系统间相互…

鸿蒙开发(二)-项目结构

鸿蒙开发(二)-项目结构 上篇文章我们讲了如何配置鸿蒙开发的基础环境,以及创建了第一个鸿蒙程序。 这篇我们讲述了鸿蒙应用的项目目录结构。 如图所示:我们切换项目project可以看到。 另一种则是Ohos模式: AppScope->app.json5 应用的全局配置 {&q…

300分钟吃透分布式缓存-26讲:如何大幅成倍提升Redis处理性能?

主线程 Redis 自问世以来,广受好评,应用广泛。但相比, Memcached 单实例压测 TPS 可以高达百万,线上可以稳定跑 20~40 万而言,Redis 的单实例压测 TPS 不过 10~12 万,线上一般最高也就 2~4 万,…

【算法沉淀】最长回文子串

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘&am…

element-ui 中 upload组件 如何传递额外的参数 ?

参考elementui 文档 如何通过data 进行额外传递参数&#xff1f;(:data"uploadData") <el-uploadref"fileUploadBtn1"class"upload-demo"accept".xls,.xlsx" :limit"1" :action"uploadFileUrl" :on-success&q…