CommitLog.asyncPutMessages: 1.记录消息存储到broker的时间 2.存储耗时相关信息,收集这些指标,上报给监控系统 3.处理延时消息(定时消息) 4.加锁 putMessage会有多个线程并行处理,需要上锁,可以再broker中配置是重入锁还是自旋锁userRetreenLockWhenputmessage,默认是false使用自旋锁,异步刷盘建议使用自旋锁,同步刷盘建议使用重入锁 5.获取最近一个commitLog文件的内容映射文件(零拷贝) 注意:这里不同版本4.5两个顺序可能有差异,有先读文件后加锁的,有先加锁后读的,推荐先加锁后读。 6.result = mappedFile.appendMessage(msg, this.appendMessageCallback, putMessageContext);把broker内部的message刷新到mappedFile缓存(这个时候还没有刷盘) 7.写入到当前位置 在commitlog的构造方法中就启动了独立的线程 同步刷盘:GroupCommitService 异步刷盘:CommitRealTimeService(用于将bytebuffer新追加的内容提交到mappedbytebuffer)即存储到堆外内存/FlushCommitLogService(将mappedbytebuffer中追加的内存写入到磁盘)
RocketMq源码解析-CommitLog
于 2022-03-23 16:19:48 首次发布