RocketMQ消息存储之刷盘机制(原理篇)
一、前言
RocketMQ的刷盘机制是一种确保消息可靠性的机制,简单来说就是Broker收到消息后,将消息存储到磁盘上。这样可以解决几个问题:
- 存储空间问题。内存空间有限,存入磁盘可以维护更多消息。
- 消息可靠性问题。消息存入磁盘后,即使断电了,重启后便可恢复消息。
二、刷盘机制原理
RocketMQ的刷盘机制原理可以参考下图。下图为官方文档的原理图,主要说明两种刷盘机制:左图是同步刷盘机制,右图是异步刷盘机制。
1、同步刷盘
上面左图代表同步刷盘机制。消息从Producder端发送出去后,被Broker接收,Broker接收到消息后将消息写入内存的PageCache后,立即通知刷盘线程进行刷盘,当前线程等待刷盘线程的通知。刷盘线程开始进行刷盘操作,刷盘完毕后唤醒之前等待的线程,再返回写成功状态,最后Producer会收到消息发送成功的ACK。
2、异步刷盘
右图代表异步刷盘机制。消息从Producder端发送出去后,被Broker接收到,Broker端接收到消息后,消息被写入PageCache后立即返回写成功给Producer端。然后另一个异步线程专门会将PageCache中的数据写到磁盘里,确保消息的持久化。
3、同步和异步刷盘的比较
从上图的比较可以发现同步和异步刷盘的主要区别在于消息写入PageCache后是否立即返回写状态。可以从几个维度分析两者的差异:
- 吞吐量。由于异步刷盘在写入PageCache后立即返回,没有经历IO操作,因此吞吐量比同步刷盘的高很多。
- 可靠性。同步刷盘是在完全写磁盘成功后才算成功,而异步刷盘是写入PageCache就返回,PageCache本质就是内存,假如在异步线程写磁盘之前机器断电了,消息还是可能丢失的,因此可靠性方面同步刷盘较高。
- 性能方面。同步刷盘写入磁盘后才算成功,而异步刷盘只需要写入内存就算成功,因此异步刷盘性能高于同步刷盘。
- 适用场景。同步刷盘可靠性高,因此适用金融等对数据要求较高的场景。异步刷盘可靠性相对来说低一些,但是性能好,因此适合要求高吞吐和高性能的场景。
4、刷盘机制配置
刷盘方式可以通过Broker配置文件里的flushDiskType参数设置,这个参数有两种值:
- SYNC_FLUSH (同步刷盘)。
- ASYNC_FLUSH (异步刷盘)。
三、主流MQ刷盘机制对比
目前很多主流MQ都有自己的刷盘机制,可以从下表对比其中的差异。
MQ名 |
刷盘机制 |
刷盘配置 |
RocketMQ |
同步刷盘、异步刷盘 |
Broker配置文件里的flushDiskType里配置 |
Kafka |
默认异步刷盘,可以通过修改参数变成同步刷盘 |
Broker配置
|
RabbitMQ |
异步持久化:根据时间段批量将内存中的数据刷新到磁盘 |
|
四、总结
本文主要介绍了RocketMQ的刷盘机制,从多个维度对比RocketMQ不同刷盘机制的区别,最后比较几种主流MQ的刷盘机制。
RocketMQ消息存储之刷盘机制(原理篇)相关推荐
- RocketMQ消息存储、刷盘、负载均衡
消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分. 消息存储总体架构 消息存储架构图: minOffset:当前队列的最小消息偏移量,如果消费时指定从最早消费,就是从该偏移量消费. m ...
- RocketMQ5.0.0消息存储<四>_刷盘机制
目录 一.刷盘概览 二.Broker刷盘机制 1. 同步刷盘 2. 异步刷盘 1):未开启堆外内存池 2):开启堆外内存池 三.参考资料 一.刷盘概览 RocketMQ存储与读写是基于JDK NIO的 ...
- RocketMQ刷盘机制
概览 RocketMQ的存储读写是基于JDK NIO的内存映射机制的,消息存储时首先将消息追加到内存中.在根据不同的刷盘策略在不同的时间进行刷盘.如果是同步刷盘,消息追加到内存后,将同步调用Mappe ...
- RocketMQ的刷盘机制
RocketMQ需要将消息存储到磁盘上,这样才能保证断电后消息不会丢失.同时这样才可以让存储的消息量可以超出内存的限制.RocketMQ为了提高性能,会尽量保证磁盘的顺序写.消息在写入磁盘时,有两种写 ...
- 顺藤摸瓜RocketMQ之刷盘机制debug解析
文章目录 Rocketmq 刷盘机制 三个文件 indexFile consumeQueue commitlog 异步刷盘 consumerqueue和indexfile文件是什么时候更新的 同步刷盘 ...
- 深入源码聊聊RocketMQ刷盘机制
大家好,我是Leo. 今天聊一下RocketMQ的三种刷盘机制. 同步刷盘 异步刷盘(RocketMQ默认) 异步刷盘+缓冲区 出自微信公众号[欢少的成长之路] 本章概括 同步刷盘 整个同步刷盘策略由 ...
- RocketMQ的消息刷盘和消息双写
详细介绍了RocketMQ的消息刷盘策略,以及RocketMQ的消息双写机制. 文章目录 1 RocketMQ的消息刷盘 2 RocketMQ的消息双写 1 RocketMQ的消息刷盘 同步刷盘:如上 ...
- mysql刷盘机制详解
目录 刷盘机制总览 log buffer(innodb的,由存储引擎分配) binlog cache(由server分配) buffer pool 自适应刷脏页Adaptive Flushing 刷盘 ...
- MySQL数据和日志的刷盘机制以及双一配置
详细介绍了MySQL数据和日志的刷盘机制以及双一配置,双一配置可以保证Mysql日志数据不丢失. 文章目录 1 内存数据的刷盘机制 2 MySQL数据的刷盘 2.1 刷盘数据来源 2.2 脏页以及刷盘 ...
最新文章
- 独立集,覆盖集,支配集,最大团,最大匹配
- ORACLE10g安装
- Qt Creator查找和更换
- Redis保存Java Session
- nodejs TCP server和TCP client如何建立连接
- 记事本linux命令换行符,Windows 10版记事本应用终于支持Linux/Mac换行符 排版不再辣眼睛...
- 热传递物理模型matlab,简单传热学计算机分析MatlabPDE二维不稳态焊接热传导求解.PPT...
- FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
- Java入门系列-24-实现网络通信
- Django:学习笔记(9)——用户身份认证
- 每日一九度之题目1021:统计字符
- 印象笔记保存html,印象笔记怎么保存网页 印象笔记保存网页教程
- 串口调试助手fx2n_PLC串口调试助手详细讲解(结合实操)
- AutoCAD中禁用shift+鼠标中键组合作为动态观察的功能
- 订单信息无法识别,建议联系卖家。 错误码:INVALID_PARAMETER
- codery-why蘑菇街商城项目梳理笔记
- python批量合并excel文件,后缀名为xls
- python-requests 模拟登陆京东
- [进程通信] 进程间通信 之 管道
- java工程师的工作述职报告,java程序员述职报告