rocketmq数据存储过程
数据持久化的流程如上图所示。
首先Broker接收到Producer的消息,会将消息顺序写入到CommitLog中,CommitLog日志文件中就存储了消息的信息,CommitLog是多个文件,每个文件最大1GB,写满了之后,会创建新的CommitLog文件,这里面的一个优化点就是消息是顺序写入 CommitLog中的,顺序写入不需要再进行寻址,比文件的随机写性能要高很多。
消息写入的时候,并不是直接写入的磁盘中,而是先写入到了os cache中,写入内存的性能非常高,写入磁盘的话需要有IO的开销,会非常慢,而且这时写入的消息在消费时也可以直接从os cache中获取,同时加快消息消费的速度。
写入了os cache中还不算已经持久化,因为消息还在内存中,不在磁盘上,这时会有os线程通过异步的方式将os cache中的消息写入到磁盘中,异步刷盘完成之后才算真正的数据持久化了(异步刷盘性能较高,如果需要保证消息不会丢失,还是要采取同步刷盘的策略)。