Store

核心类

  • MappedFile:00000000000000000000等字节文件,用于保存消息。

    • 每个MappedFile文件统一文件大小,默认为1G;没有填满消息的,使用空白占位符部族

    • 文件命名格式:filename[n] = filename[n-1] + mappedFileSize

  • MappedFileQueue:管理MappedFile文件的队列

  • CommitLog:消息存储的核心类

消息存储流程

封装消息体,执行加锁操作,从mappedFileQueue队列中获取mappedFile,没有或满了就新创建一个mappedFile,mappedFile执行添加消息操作,然后释放锁,并执行刷盘和主从同步操作。

执行MappedFile的appendMessage()会调用appendMessagesInner方法。

封装消息持久化格式,放入缓存区。

刷盘

当添加完消息到MappedFile之后,会触发刷盘机制,根据配置选择同步刷盘还是异步刷盘。

刷盘操作的核心是MappedFile类的flush方法。通过FileChannel和MappedByteBuffer来将内存中的数据,同步到磁盘。优先使用FileChannel。两者之间的性能比较。

同步刷盘

之所以阻塞是因为request中有闭锁,当GroupCommitService从队列中取出request并执行完刷盘之后,闭锁释放。

异步刷盘

Last updated