当前位置: 首页 > news >正文

【RocketMQ问题总结-2】

RocketMQ 消息持久化

在这里插入图片描述

Broker通过底层的Netty服务器获取到一条消息后,会把这条消息的内容写入到一个CommitLog文件里去(一个Broker进程就只有一个CommitLog文件,也就是说这个Broker上所有Topic的消息都会写入这个文件)。
同时,Broker还会异步地把消息写入到ConsumeQueue文件里去,每一个MessageQueue都对应了一个ConsumeQueue文件。
最后,Broker还会异步地把消息写入一个IndexFile文件里,该文件中保存着消息的key以及消息在CommitLog中的offset偏移量(会自动关联并建立索引),这样后续如果要查询消息,只需要根据消息key从IndexFile中索引出偏移量,就可以立刻在CommitLog文件中找到消息了。
RocketMQ正式通过磁盘文件顺序写+OS PageCache写入+OS异步刷盘的策略来保证消息写入的性能。
在上述这种异步刷盘的模式下,Producer将消息发送给Broker,Broker将消息写入OS PageCache中,就会直接返回ACK给生产者,生产者收到ACK消息就认为写入成功了。
有异步刷盘就有同步刷盘,同步刷盘主要的不同点就是,只有Broker强制把这条消息刷入底层的磁盘文件后,才会返回ACK给生产者。
在异步刷盘的模式下,如果Broker将消息写入PageCahe并响应给生产者后突然宕机,此时消息在缓存中没有写入底层的磁盘文件,就会造成消息丢失——生产者认为发送成功,实际上消息写入失败。

MQ中的零拷贝应用

在这里插入图片描述
用户应用进程调用read函数,向操作系统发起IO调用,上下文从用户态转为内核态(切换1)
DMA控制器把数据从磁盘中,读取到内核缓冲区。
CPU把内核缓冲区数据,拷贝到用户应用缓冲区,上下文从内核态转为用户态(切换2),read函数返回
用户应用进程通过write函数,发起IO调用,上下文从用户态转为内核态(切换3)
CPU将应用缓冲区中的数据,拷贝到socket缓冲区
DMA控制器把数据从socket缓冲区,拷贝到网卡设备,上下文从内核态切换回用户态(切换4),write函数返回

http://www.lryc.cn/news/345221.html

相关文章:

  • 掌握Android Fragment开发之魂:Fragment的深度解析(上)
  • 深度解读DreamFusion:一站式AI解决方案
  • JVM-02
  • 【一起深度学习——NIN】
  • 数字工厂管理系统如何助力企业数据采集与分析
  • uniap之微信公众号支付
  • Django知识点总结
  • 算法(C++
  • Python专题:六、循环语句(1)
  • 力扣2105---给植物浇水II(Java、模拟、双指针)
  • Windows设置Redis为开机自启动
  • 行业早报5.10
  • Java+SpringBoot+JSP实现在线心理评测与咨询系统
  • 机器学习算法应用——K近邻分类器(KNN)
  • python数据分析——数据的选择和运算
  • 《CKA/CKAD应试指南/从docker到kubernetes 完全攻略》学习笔记 第8章 deployment
  • 步态识别论文(6)GaitDAN: Cross-view Gait Recognition via Adversarial Domain Adaptation
  • K8S中的弹性云服务如何搭建,可能遇到的问题,如何解决!(稳啦!!!!全都稳啦!!!)
  • 新增分类——后端
  • 20232801 2023-2024-2 《网络攻防实践》实践九报告
  • 类和对象--this引用原理
  • 力扣:416. 分割等和子集(Java,动态规划:01背包问题)
  • Vue进阶之Vue项目实战(一)
  • 预告 | 飞凌嵌入式邀您共聚2024上海充换电展
  • vite 打包配置并部署到 nginx
  • ResponseHttp
  • 【题解】非对称之美(规律)
  • 遇到如此反复的外贸客户,你可以这样做~
  • 【数据库】简单SQL语句
  • K邻算法:在风险传导中的创新应用与实践价值