面试题答案
一键面试RocketMQ有两种刷盘机制:同步刷盘和异步刷盘。
同步刷盘
- 消息存储文件写入流程:当生产者发送消息到Broker后,Broker会将消息先写入到PageCache,然后立刻调用刷盘操作,将PageCache中的数据强制刷入磁盘的CommitLog文件中,等待刷盘完成后才向生产者返回成功响应。
- 对系统性能影响:同步刷盘会严重影响系统性能,因为每次消息写入都需要等待刷盘完成,磁盘I/O操作成为性能瓶颈,特别是在高并发写入场景下,系统吞吐量会明显降低。
- 对数据可靠性影响:数据可靠性极高,只要消息被成功发送并得到Broker的成功响应,就一定已经持久化到磁盘,不会因为系统故障等原因丢失。
异步刷盘
- 消息存储文件写入流程:生产者发送消息到Broker,消息先写入PageCache,然后Broker启动一个异步线程,定期将PageCache中的数据刷入磁盘的CommitLog文件。在这个过程中,生产者发送消息后,Broker不需要等待刷盘完成就可以向生产者返回成功响应。
- 对系统性能影响:异步刷盘极大提升了系统性能,因为消息写入操作无需等待刷盘,减少了I/O等待时间,系统吞吐量可以显著提高,适合高并发写入场景。
- 对数据可靠性影响:数据可靠性相对同步刷盘略低,因为在异步刷盘过程中,如果系统突然宕机,PageCache中未来得及刷入磁盘的数据会丢失。不过,RocketMQ通过一些机制(如刷盘时间间隔、刷盘时机策略等)来尽量降低这种风险。