RocketMq源码随笔-刷盘
RocketMq源码随笔-刷盘 引言 在rocketmq中有两种刷盘模式:同步刷盘和异步刷盘。 从类图上来看,有三个不同的实现思路。那下面逐一来看过。 适用情况如下 同步刷盘使用GroupCommitService。 异步刷盘且未开启TransientStorePool,使用FlushRealTimeService。 异步刷盘且开启TransientStorePool,使用CommitRealService。 欢迎加入技术交流群186233599讨论交流,也欢迎关注技术公众号:风火说。 <!--more--> GroupCommitService GroupCommitService是在同步刷盘的时候会使用到的。 该类有两个属性:requestsWrite和requestsRead。都是使用volatile关键字修饰的List对象。 putRequest 该方法用于将刷盘请求放入。首先是对requestWrite对象进行加锁处理,然后将请求放入其中后,解锁。解锁换成后,调用方法wakeup唤醒可能在休眠中的线程。 doCommit 这个方法是在run方法中被调用。真正实现了数据的磁盘刷写。下面来看下逻辑。 首先是在requestRead上进行加锁。 如果requestRead队列不为空,则进行子流程刷盘操作。 遍历requestRead列表,为每一个元素执行对应的逻辑,如下: