对于生产者来说,将消息写到commit log文件里面。这里会有消息的逻辑队列,逻辑队列里面保存了消息的偏移量。

除了consumerquenue之外,它还会将数据分发到另外一个文件叫indexfile索引文件里面。

这个索引文件可以保存消息的一些信息,比如物理的偏移量,消息的键,消息的头。然后还可以通过hash找到消息的位置。

这里面有个非常关键点叫做时间戳。在timestamp时间戳里面,之前在聊kafka的时候说过,kafka也可以根据某个时间点来找到某个消息的偏移量,Rocketmq也具备这种能力。

可以根据某个时间点来找到这个偏移量,在另外一个索引文件IndexFile里面提供了可以搜索数据的地方。

IndexFile

IndexFile(索引⽂件)提供了⼀种可以通过key或时间区间来查询消息的⽅法。
Index⽂件的存储位置是:$HOME \store\index${fileName},⽂件名fileName是以创建时的时间戳命名的,固定的单个IndexFile⽂件⼤⼩约为400M,⼀个IndexFile可以保存 2000W个索引,IndexFile的底层存储设计为在⽂件系统中实现HashMap结构, 故rocketmq的索引⽂件其底层实现为hash索引。
在上⾯的RocketMQ的消息存储整体架构图中可以看出,RocketMQ采⽤的是混合型的存储结构,即为Broker单个实例下所有的队列共⽤⼀个⽇志数据⽂件(即为 CommitLog)来存储。
RocketMQ的混合型存储结构(多个Topic的消息实体内容都存储于⼀个CommitLog)针对ProducerConsumer分别采⽤了数据和索引部分相分离的存储结构Producer发送消息⾄Broker端,然后Broker端使⽤同步或者异步的⽅式对消息刷盘持久化,保存⾄CommitLog中。只要消息被刷盘持久化⾄磁盘⽂件 CommitLog中,那么Producer发送的消息就不会丢失。
正因为如此,Consumer也就肯定有机会去消费这条消息。当⽆法拉取到消息后,可以等下⼀次消息拉取,同时服务端也⽀持⻓轮询模式,如果⼀个消息拉取请求未拉取到消息,Broker允许等待
30s的时间,只要这段时间内有新消息到达,将直接返回给消费端。
这⾥, RocketMQ的具体做法是,使⽤Broker端的后台服务线程—ReputMessageService不停地分发请求并异步构建ConsumeQueue(逻辑消费队列)和IndexFile(索引⽂件) 数据。

真正的数据是保存在commit log里面

#commitLog存储路径
storePathCommitLog=/usr/local/rocketmq/broker-a-master/store/commitlog[root@localhost commitlog]# ls
00000000000000000000

如果所有的操作都在访问00000000000000000000这样的数据文件,它的性能会有一些影响。

为了解决这个问题Rocketmq做了一些提升。虽然这部分是磁盘文件,但是Rocketmq使用了顺序的读写使用了页缓存的概念,使用了0拷贝相关的技术让Rocketmq在读这个文件的性能上面也可以做到非常快。

页缓存与内存映射

如果所有的数据都在访问磁盘文件,在访问磁盘文件的时候会存在用户态到内核态的转换。
在用户态要读取和写入文件,这个是磁盘上面的文件。所以要转化为内核态。去读取磁盘上的文件。
为了解决这样一个问题,rocketmq提供了页缓存,操作系统使用页缓存的机制,在读取缓存的时候,它们之间会创建映射的关系。用内存当中的缓存映射出磁盘的数据。
⻚缓存(PageCache)OS对⽂件的缓存,⽤于加速对⽂件的读写。⼀般来说,程序
对⽂件进⾏顺序读写的速度⼏乎接近于内存的读写速度,主要原因就是由于OS使⽤
PageCache机制对读写访问操作进⾏了性能优化,将⼀部分的内存⽤作PageCache
对于数据的写⼊,OS会先写⼊⾄Cache内,随后通过异步的⽅式由pdflush内核线程
Cache内的数据刷盘⾄物理磁盘上。
对于数据的读取,如果⼀次读取⽂件时出现未命中PageCache的情况,OS从物理磁盘上访问读取⽂件的同时,会顺序对其他相邻块的数据⽂件进⾏预读取。

那在读写的时候要比直接读取磁盘要快的多,这个做的性能优化。
除了这样一个性能优化还做了一个事情叫做顺序的读写,OS从物理磁盘上访问读取⽂件的同时,会顺序对其他相邻块的数据⽂件进⾏预读取。这样的话也能够将速度有个很大的提升。顺序读写和随机读写性能是相差很大的。
比如还有0拷贝这块
store里面还会有一些文件
[root@localhost store]# ls  -l
total 8
-rw-r--r--. 1 root root    0 Sep 18  2024 abort
-rw-r--r--. 1 root root 4096 Aug 17 15:49 checkpoint
drwxr-xr-x. 2 root root   34 Sep 27  2024 commitlog
drwxr-xr-x. 2 root root  246 Aug 17 15:50 config
drwxr-xr-x. 3 root root   23 Sep 22  2024 consumequeue
drwxr-xr-x. 2 root root   31 Nov 24  2024 index
-rw-r--r--. 1 root root    4 Nov 24  2024 lock

abort文件,这个abort文件大小是0,当broker启动的时候会去创建这个abort文件。当broker在正常关闭的时候,abort文件会被删除掉。

当broker在启动的时候发现在store里面有这个abort文件,那么意味着上一次是非正常关闭,所以会配有相应的机制去做一些偏移量,配置的检查。所以这是abort文件的一些作用。

config文件下面的json文件,比如topic的信息会被保存到topics文件里面。比如topics是用来保存topic的一些信息。

在控制台展示的数据其实也是从这些json文件里面读取到的。

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

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

相关文章

辗转相除法(欧几里得算法)的证明

欢迎访问我的主页: https://heeheeaii.github.io/ 辗转相除法是一种用于计算两个非负整数最大公约数的有效算法。它的证明主要分为两个部分: 证明核心引理: gcd(a,b)gcd(b,amodb)证明算法的收敛性: 证明算法一定会在有限步内结束。 辗转相除法…

RL【3】:Bellman Optimality Equation

系列文章目录 文章目录系列文章目录前言Definition of optimal policyBellman optimality equationIntroductionMaximization on the right-hand sideContraction mapping theoremSolutionOptimalityAnalyzing optimal policies总结前言 本系列文章主要用于记录 B站 赵世钰老师…

有序数组,距离目标最近的k个数 二分查找

🤔 新手做题思路:第1步:理解题目- 找距离x最近的k个数- 数组已排序- 返回结果也要排序(升序)- 距离相同时,选择较小的数第2步:关键insight- 数组已排序 → 考虑二分查找- 最近的k个数一定是连续…

学习心得分享

我认为知识是一定要系统化的学习,结构化梳理,这样在运用或思考的时候,能够回忆起自己在这一块梳理的知识结构,如果有记录那么能快速回忆并理解,如果没有记录,那么说明对自己来说超纲了,把知识进…

为什么说 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天这个全球化的商业战场上,中国企业的出海已从“选择题”变为“必答题”。当我们满怀雄心,将产品和业务推向海外市场时,基础设施的选择,往往是决定成败的第一步。它不仅关乎成本与性能,更直接影响着团队的开发效率…

NSSCTF每日一题_Web_[SWPUCTF 2022 新生赛]奇妙的MD5

为了保持做题的感觉和持续学习,也就有了每日一题系列,选一些有意义的题目或者一些CTF新颖题目作为参考学习。[SWPUCTF 2022 新生赛]奇妙的MD51. 访问首页界面并进行分析估计题目MD5提示,查询得知ffifdyop 这个字符串是一个奇妙的MD5字符串因为将“ffifdy…

服务器IP暴露被攻击了怎么办?

当服务器IP暴露后,可能会面临各种网络攻击,如DDoS攻击、端口扫描、恶意入侵等,这将严重影响服务器的正常运行和数据安全。本文将从检测攻击类型、采取紧急防护措施、优化服务器配置、寻求专业支持以及预防未来攻击五个方面,详细探…

TDengine 时间函数 TIMETRUNCATE 用户手册

TDengine TIMETRUNCATE 函数用户使用手册 函数概述 TIMETRUNCATE 是 TDengine 中的一个时间处理标量函数,用于将时间戳按照指定的时间单位进行截断操作。该函数在时间数据聚合、分组和统计分析中非常有用,特别适用于智能电表等时序数据的分析场景。 语…

Linux电脑怎样投屏到客厅的大电视?支持远程投屏吗?

一般的电脑投屏软件都会推出Windows版本和macOS版本,虽然这两个版本已经覆盖大部分消费者的常用电脑,但是依然有一部分群体因为电脑系统版本问题不能使用投屏软件。 如果你当前使用的是Linux系统的电脑,而且又要将电脑投屏投屏到客厅的大电视…

MP4视频太大如何压缩?分享6种简单便捷的压缩小技巧

随着拍摄高清视频的设备越来越多,我们经常会遇到MP4视频文件体积过大的问题,无论是上传到社交平台、发送给朋友,还是存储在设备中,过大的视频文件都会带来诸多不便。那么,MP4视频太大怎么压缩呢?本文将介绍…

k8s 部署 redis

创建部署文件 vim redis.yaml添加如下内容: apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建议生产环境使用更复杂的密码 ---…

FFMPEG H264

一、H264压缩编码1.1 H264 中的 I 帧、P帧和 B帧H264 使用帧内压缩和帧间压缩的方式提高编码压缩率;H264 采用了独特的 I 帧、P 帧和 B 帧策略来实现,连续帧之间的压缩;1.2 其他概念GOP(图像组):一个IDR帧到…

Unity 解决天空盒中间出现一条线

问题解决找到天空盒对应贴图,在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾选即可。效果动态修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬虫实战:研究Showcase模块,构建电商平台销售数据采集和分析系统

1. 引言 1.1 研究背景 在数字经济快速发展的今天,电商平台积累了海量的商品信息、交易数据和用户反馈,这些数据蕴含着丰富的市场洞察。根据中国电子商务研究中心数据,2024 年我国网络零售市场规模突破 15 万亿元,平台商品数据呈现指数级增长。如何高效提取这些数据并转化…

C++中的Reactor和Proactor模型进行系统性解析

<摘要> 本解析系统阐述了网络编程中Reactor与Proactor两种高性能I/O模型的核心概念。Reactor基于同步I/O多路复用&#xff0c;通过事件循环分发通知&#xff0c;由应用层自行完成I/O操作&#xff1b;而Proactor则基于异步I/O&#xff0c;由操作系统完成I/O操作后主动回调…

【技术教程】如何将文档编辑器集成至基于Node.js的网页应用程序中

当今数字化时代&#xff0c;Web应用对在线文档编辑的需求日益增长。无论是构建在线办公系统、内容管理平台还是协作工具&#xff0c;让用户能够直接在浏览器中编辑和处理文档已成为基本需求。 想知道如何为你的 Node.js 应用添加强大的在线文档编辑功能吗&#xff1f;本文手把…

[论文阅读] 人工智能 + 软件工程 | 别让AI写的代码带“漏洞”!无触发投毒攻击的防御困境与启示

别让AI写的代码带“漏洞”&#xff01;无触发投毒攻击的防御困境与启示 论文信息 原标题&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;评估NL-to-Code模型应对无触发数据投毒攻击的防御方法&#xff09;主要…

【Windows】通过 runas 命令实现多用户权限测试的完整流程

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ 前期准备&#xff1a;创建管理员/普通测试用户1.1 创建普通用户Test&#xff08;无管理员权限&#xff09;1.2 创建管理员用户Admin&#xff08;含管理员权限&#xff09;2️⃣ 核心操作&#xff1a;通过runas命令切换用户命令行环境2.1…

新后端漏洞(上)- H2 Database Console 未授权访问

漏洞介绍&#xff1a; H2 database是一款Java内存数据库&#xff0c;多用于单元测试。 H2 database自带一个Web管理页面&#xff0c;在Spirng开发中&#xff0c;如果我们设置如下选项&#xff0c;即可允许外部用户访问Web管理页面&#xff0c;且没有鉴权&#xff1a; spring.h2…

2025-09-04 HTML3——区块布局与表单

文章目录1 块元素与行内元素1.1 块元素 (Block-level Element)1.2 行内元素 (Inline Element)2 HTML 布局2.1 使用 <div> 元素2.2 使用 <table> 元素3 表单 (<form>)3.1 输入域&#xff08;<input>&#xff09;3.1.1 文本域&#xff08;Text Fields&am…