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

刷盘机制

生产者发布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.mzph.cn/bicheng/52555.shtml

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

相关文章

GoWeb 设置别名和多环境配置

别名 vite.config.ts中添加代码如下即可 //设置别名resolve: {alias: {"": path.resolve(process.cwd(),"src"),//用替代src}}随后即可使用 配置多环境 vite.config.ts中添加代码如下 envDir: ./viteenv,//相对路径随后在项目根目录创建对应的viteenv…

【游戏速递】 小猪冲刺:萌动指尖的极速挑战,小虎鲸Scratch资源站独家献映!

在线玩:Scratch小猪冲刺:全新挑战的几何冒险游戏-小虎鲸Scratch资源站 想象一下,一群憨态可掬的小猪,穿上炫酷的装备,踏上了追逐梦想的赛道。它们或跳跃、或滑行,灵活躲避各种障碍,只为那终点的…

Web API 学习笔记 第四弹

1.时间戳 获取时间戳的方法①date.getTime()②new Date() 2.定时器 console.log(111)setTimeout(()>{console.log(222)},1000)console.log(333) console.log(111)setTimeout(()>{console.log(222)},0)console.log(333) 这两段代码打印结果分别是? 第一段 …

在SpringBoot项目中如何集成eureka

Eureka 是 Netflix 开源的一个服务注册与发现的组件,通常用于 Spring Cloud 微服务架构中。集成 Eureka 和 Spring Boot 可以帮助我们创建一个高可用的服务注册中心,允许服务在集群中自动注册和发现。 下面是一个简单的 Spring Boot 项目集成 Eureka 的…

【STM32】驱动OLED屏

其实我没买OLED屏哈哈哈,这个只是学习了,没机会实践。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 显示原理 2 读写方式:8080并口 2.1 支持的指令类型 2.2 …

【Tesla FSD V12的前世今生】从模块化设计到端到端自动驾驶技术的跃迁

自动驾驶技术的发展一直是全球汽车行业的焦点,Tesla的Full-Self Driving(FSD)系统凭借其持续的技术革新和强大的数据支持,在这个领域独占鳌头。本文将深入介绍Tesla FSD V12的演进历史,从自动驾驶的基础概念入手&#…

数据结构-时间、空间复杂度-详解

数据结构-时间复杂度-详解 1.前言1.1数据结构与算法1.2如何衡量一个算法的好坏1.3复杂度 2.时间复杂度2.1是什么2.2大O符号只保留最高阶项不带系数常数次为O(1) 2.3示例示例2.1示例2.2示例2.3示例2.4 2.4题目 3.空间复杂度3.1是什么3.2大O符号3.3示例示例1示例2示例3示例4 4.题…

结合element和原生写法<a>标签实现excel文件的下载和上传

本项目要求&#xff1a;用户下载excel模板&#xff0c;填写资料后上传 模板保存在项目文件中&#xff0c;使用a标签点击下载 html <el-uploadv-model:file-list"fileList":before-upload"beforeUpload":limit"1":on-exceed"handleExce…

2024-08-26 更改驱动器号导致的软件崩溃问题

​ 在给电脑重新分盘时&#xff0c;想把 Software 盘的驱动器号&#xff08;E:&#xff09;改为对应的首字母 S&#xff0c;因此导致了所有软件崩溃。主要原因是软件主要依据驱动器号识别位置&#xff0c;而更改驱动器号后&#xff0c;并不会将软件设置的驱动器号一并更改。 ​…

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

车载通信框架--- 以太网重连Port口相关思考

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

ubuntu22.04使用kubeadm部署k8s集群

使用kubeadm部署一个k8s集群&#xff0c;1个master2个worker节点 1.环境信息 操作系统&#xff1a;ubuntu22.04内存&#xff1a;16GBCPU&#xff1a;4网络&#xff1a;能够互访&#xff0c;能够访问互联网 hostnameip备注node0110.121.218.50masternode0210.121.218.49worke…

普通项目解决跨域问题和springSecurity解决跨域问题

普通项目解决跨域问题 添加一个配置文件 package com.lzy.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframewor…

手机mkv转换mp4:轻松实现视频格式兼容

如今手机已成为我们日常生活中不可或缺的伴侣&#xff0c;而视频文件则是我们享受娱乐、获取信息的重要来源。然而&#xff0c;由于不同设备和平台对视频格式的支持各有不同&#xff0c;我们有时会遇到无法在手机上播放某些视频文件的问题。 mkv是一种常见的视频格式&#xff…

java接口 controller层接收list集合传参,postman 调用接口时required parameter XXX is not present

开发过程中开发一个java接口 controller层接收list集合传参&#xff0c;然后postman调用一直不成功&#xff0c;报错 使用RequestParam方式&#xff0c;如果postman 调用接口时报错required parameter XXX is not present 可能是&#xff08;value“items”&#xff09;跟你输…

A Neural Probabilistic Language Model

摘要 统计语言建模的一个目标是学习单词序列的联合概率函数。由于维度的诅咒&#xff0c;这在本质上是困难的:我们建议用它自己的武器来对抗它。在提出的方法中&#xff0c;人们同时学习(1)每个单词的分布式表示&#xff08;词向量&#xff09;(即单词之间的相似性)以及(2)表示…

在进行网站链接时,‌加上http或https的重要性不言而喻

这一简单的操作背后&#xff0c;‌蕴含着对搜索引擎优化&#xff08;‌SEO&#xff09;‌的深刻理解&#xff0c;‌以及对网站权重提升的精准把握。‌以下&#xff0c;‌我们将深入探讨这一话题&#xff0c;‌以期为您的网站优化提供有价值的参考。‌优化&#xff08;‌SEO&…

C/C++控制台贪吃蛇游戏的实现

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 一、…

数据可视化大屏模板-美化图表

Axure作为一款强大的原型设计软件&#xff0c;不仅擅长构建交互式界面&#xff0c;更在数据可视化方面展现出了非凡的创意与实用性。今天&#xff0c;就让我们一起探索Axure设计的几款精美数据可视化大屏模板&#xff0c;感受数据之美。 立体图表的视觉冲击力 Axure的数据可视…

银河麒麟桌面操作系统V10:如何设置应用开机自启动?

银河麒麟桌面操作系统V10&#xff1a;如何设置应用开机自启动&#xff1f; 1、图形界面设置2、命令行设置3、注意 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、图形界面设置 打开“设置”->“系统”->“开机启动”。点击“添加…