RocketMQ~刷盘机制、主从复制方式、存储机制

news2024/9/25 7:23:52

刷盘机制

生产者发布MQ给Brocker,Brocker在存储这些数据的时候,需要进行刷盘,分为同步刷盘和异步刷盘。

在同步刷盘中需要等待一个刷盘成功的ACK,同步刷盘对MQ消息可靠性来说是一种不错的保障,但是性能上会有较大影响,一般地适用于金融等特定业务场景。

而异步刷盘往往是开启一个线程去异步地执行刷盘操作。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量,一般适用于如发验证码等对于消息保证要求不太高的业务场景。

一般地,异步刷盘只有在Broker意外宕机的时候会丢失部分数据,你可以设置Broker的参数FlushDiskType来调整你的刷盘策略(ASYNC_FLUSH或者SYNC_FLUSH)
在这里插入图片描述

同步复制和异步复制

上面的同步刷盘和异步刷盘是在单个结点层面的,而同步复制和异步复制主要是指的Borker主从模式下,主节点返回消息给客户端的时候是否需要同步从节点。

  • 同步复制:也叫"同步双写",也就是说,只有消息同步双写到主从节点上时才返回写入成功。
  • 异步复制:消息写入主节点之后就直接返回写入成功。

然而,很多事情是没有完美的方案的,就比如我们进行消息写入的节点越多就更能保证消息的可靠性,但是随之的性能也会下降,所以需要程序员根据特定业务场景去选择适应的主从复制方案。

异步同步复制策略,不仅影响消息的可靠性,还影响到了这个Brocker的可用性。

存储机制

首先想大家介绍RocketMQ消息存储架构中的三大角色: CommitLog、ConsumeQueue 和 IndexFile。

  • CommitLog:消息主体以及元数据的存储主体,存储 Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G,记录了消息内容以及大小,当第一个文件写满了,消息主要是顺序写入日志文件,当文件满了,写入下一个文件。
  • ConsumeQueue:消息消费队列,引入的目的主要是提高消息消费的性能,由于RocketMQ 是基于主题 Topic的订阅模式,消息消费是针对主题进行的,如果要遍历 Commitlog文件中根据Topic检索消息是非常低效的。Consumer即可根据 ConsumeQueue 来查找待消费的消息。其中,ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量 offset,消息大小size和消息息Tag的HashCode值。consumequeue文件可以看成是基于 topic 的 commitlog索引文件
  • IndexFile:IndexFile (索引文件)提供了一种可以通过key或时间区间来查询消息的方法。

总结来说,整个消息存储的结构,最主要的就是CommitLoq和ConsumeQueue。而ConsumeQueue你可以大概理解为Topic中的队列。

RocketMQ 采用的是混合型的存储结构。即为 Broker单个实列下所有的队列共用一个日志数据文件来存储消息。有意思的是在同样高并发的 Kafka中会为每个Topic分配一个存储文件。这就有点类似于我们有一大堆书需要装上书架,RocketMQ是不分书的种类直接成批的塞上去的,而Kafka分类区域的,是将书本放入指定的。这也是和Kafka最大的区别,也是为什么Kafka建议在少Topic,单TopicQPS大的场景下使用

RocketMQ为什么要这么做呢?原因是提高数据的写入效率,不分Topic意味着我们有更大的几率获取成批的消息进行数据写入,但也会带来一个麻烦就是读取消息的时候需要遍历整个大文件,这是非常耗时的。

所以,在RocketMQ中又使用了 ConsumeQueue 作为每个队列的索引文件来提升读取消息的效率。我们可以直接根据队列的消息序号,计算出索引的全局位置,然后直接读取这条索引,再根据索引中记录的消息的全局位置,找到消息。

生产者发送消息会指定 Topic 、QueueId和具体消息内容,而在 Broker中管你是哪门子消息,他直接全部顺序存储到了CommitLog。而根据生产者指定的Topic 、 QueueId、这条消息本身在 CommitLog的偏移(offset),消息本身大小、和tag的hash值存入对应Topic的 ConsumeQueuue索引文件中。而在每个队列中都保存了Consume0ffset 即每个消费者组的消费位置,消费者拉取消息进行消费的时候只需要根据 Consume0ffset在ConsumeQueuue文件中获取下一个未被消费的消息就行了。

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

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

相关文章

推荐5款能够写出高质量文章的ai写作工具!

在如今的信息爆炸时代,内容创作者面临着前所未有的挑战:如何快速而高质量地产生内容,满足日益增长的读者群需求。 无论是自媒体人士、博客作者、学者还是学生,大家都在寻找一种能够提升写作效率与质量的解决方案。 幸运的是&…

oneapi 获取通义千问模型密钥

1、打开 阿里云百炼大模型平台,点击开通,登录账号 2、获取密钥 3、查看模型名称,可以添加到 oneapi 的渠道中 别忘了添加向量模型

基于Java+SpringBoot+Vue的师生共评的作业管理系统设计与实现

基于JavaSpringBootVue的师生共评的作业管理系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方…

MySQL从入门到精通(第9-10章)

文章目录 9 子查询9.1 需求分析与问题解决9.1.1 实际问题9.1.2 子查询的使用9.1.3 子查询的分类 9.2 单行子查询9.2.1 单行比较操作符9.2.2 代码示例9.2.3 HAVING中的子查询9.2.4 CASE中的子查询9.2.5 子查询中的空值问题9.2.6 非法使用子查询 9.3 多行子查询9.3.1 多行比较操作…

文心快码 Baidu Comate 前端工程师观点分享:以文心快码 Baidu Comate为例,智能代码助手需要什么(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上,从一款文心快码(Baidu Comate)前端工程师的角度,分享了关于智能研发工具本身的研…

数据库的读写分离技术MVCC

本文纯理论学习,无知之处请给与包涵! 写作不易,觉得好,麻烦请点广告支持下 分享一下! 作者不支持读者的任何抽象行为,阅读本文产生的任何后果,作者概不负责 MVCC 英文全称叫多版本并发控制协议. 以前做ORACLE DBA时候没有听说过.后来转到MYSQL DBA就听说…

Vastbase——单机安装部署

一、依赖软件环境检查 yum install -y zlib-devel libaio libuuid readline-devel krb5-libs libicu libxslt tcl perl openldap pam openssl-devel libxml2 bzip2 二、系统和环境配置 1.检测及关闭目标部署机器的防火墙 sudo firewall-cmd --state sudo systemctl status …

分布式数据一致性小结

文章目录 简介一、线性一致性二、顺序一致性三、因果一致性四、以客户端为中心的一致性参考 简介 分布式一致性问题包括数据一致性问题和事务一致性问题。在此仅关注数据一致性问题,数据一致性问题是因为分布式系统下数据需要复制而导致的。 而数据一致性模型就是…

关于使用Object.create(null)来创建空对象,而不直接使用{}的优势

文章目录 前言1. 使用Object.create(null) 和 直接{}的区别2.子类继承父类3. 子类继承父类---进阶 前言 问题:为什么vue源码中使用Object.create(null)来创建空对象,而不直接使用{}??? 1. 使用Object.create(null) 和 直接{}的区别 优势&#xff1a…

Qt:玩转QPainter序列四

前言 接着干源码 正文 先看源码,然后我们逐条分析 QPainter 是一个强大的绘图类,用于在 QWidget、QImage、QPixmap 等设备上进行绘图操作。下面我会详细解释你提到的各个函数和属性,并通过示例展示它们的用法。 1. font() 和 setFont() …

彻底改变音乐产业——人工智能如何实现利润最大化并重塑市场

引言 索尼音乐 收购 以惊人的 1 亿英镑收购了 Queen 的音乐目录。近年来,我们看到投资基金投入数亿美元收购 Justin Bieber、Bruce Springsteen、Katy Perry 等顶级艺术家的音乐版权。据 Cambridge Associates 称,从 2013 年到 2017 年,仅音…

.NET COER+CONSUL微服务项目在CENTOS环境下的部署实践

一、整体的环境安装与部署 1.1、DOCKER环境的部署 1.1.1 安装DOCKER yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast && yu…

python学习9-数据获取与整理5

有点是生成快,如果想炫酷 还是要前端生成,比如 echarts Matplotlib可视化 Matplotlib是Python中最重要的数据可视化库之一,它提供了多种绘图工具,可以生成各种硬拷贝格式和交互式环境下的多种平台上的图形。本文将详细讲解Matplo…

【MySQL】一文带你理清InnoDB引擎的<内部架构>(内存结构,磁盘结构,后台线程)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

【python报错已解决】`Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python`

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 在开发过程中,环境配置常常会引发一些难以预料的报错。如何快速定位并解决这些问题,成…

【C++ Primer Plus习题】5.6

问题: 解答: #include <iostream> using namespace std;#define MONTHSCOUNT 12 #define YEARS 3int main() {string months[MONTHSCOUNT] { "January","February","March","April","May","June","J…

10倍加速LLM计算效率:消失的矩阵乘

矩阵乘法&#xff08;MatMul&#xff09;是深度学习中的主要计算瓶颈&#xff0c;尤其在ChatGPT等Transformer模型中&#xff0c;矩阵乘法的运行时长约占其总运行时长的45-60%&#xff0c;解决这一挑战对发展更经济的大模型具有重要意义。 为此&#xff0c;加州大学的研究人员在…

服务器搭建记录(两台服务器通过一个路由器的LAN口联网)

目录 服务器搭建记录&#xff08;两台服务器通过一个路由器的LAN口联网&#xff09;操作步骤&#xff1a;一、安装N卡驱动二、安装cuda三、安装cudnn四、配置SSH五、为服务器创建新sudo用户账号六、安装docker和NVIDIA-docker七、通过联网路由器 遇到的一些问题&#xff1a;参考…

小白之 FastGPT Windows 本地化部署

目录 引言环境步骤1. 安装 docker2. 启动 docker3. 浏览器访问4. One API 配置语言模型、向量模型渠道和令牌5. 创建 FastGPT 知识库6. 创建 FastGPT 应用 官方文档 引言 部署之前可以先看一下 RAG 技术原理&#xff0c;也可以后面回过头来看&#xff0c;对一些概念有些了解&a…

【C++指南】类和对象(二)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注