1.前言
此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂
这篇文章紧挨着上一篇博客来进行编写,有些不清楚的可以看下上一篇博客:RocketMQ相关原理简述-CSDN博客
2.topic,messageQueue,broker
topic的创建的时候需要进行指定MessageQueue的数量,那么topic,messageQueue,broker之间的关系是什么呢,假如你有一个topic,这个topic里有4个messageQueue,topic里有100条数据,那么到每个messageQueue里就会有25条数据,每个messageQueue里的数据的数量也不是固定,是根据消息写入MessageQueue时候的策略定的。这些MessageQueue是存放到Broker上来。大致格式如下所示:
生产消息的时候要选择哪个messageQueue进行写入?
生产者会从NameServer集群上进行拉取Topic的元数据信息,这些元数据信息包含:topic里有哪些MessageQueue,这些MessageQueue都是位于哪个Broker上呢。生产者拉取到这些信息,就会按照MessageQueue的写入策略将对应的数据写入的到应的Broker上。
3.broker的数据存储
当生产者将消息发送到broker之后,会做什么操作呢。首先会将消息存储到日志文件中。这个日志文件叫做commitLog,直接是顺序写这个文件。这个CommitLog是很多磁盘文件,每个磁盘文件限定最多1G,如果写满1G,就会创建一个新的CommitLog文件。
上述图感觉是没有进行说明MessageQueue是在哪里体现,其实,在一个Broker里,每个Topic下的每个MessageQueue都会有一系列的ConsumeQueue文件。
在磁盘上就会有下面格式的日志文件:
$Home/store/consumequeue/{topicId}/{queueId}/{filename}
topicId指的是某个topic,queueId指的是某个MessageQueue,这个ConsumeQueue文件中存储的是一条消息在commitLog日志中的Offset偏移量。
具体来说:有一个topic,它有4个MessageQueue,然后在两个Broker上,每个Broker上会存储两个MessageQueue,当broker收到一条消息之后,会写入到commitLog日志文件中,并获取这条消息在CommitLog日志文件中的偏移量offset,写入到MessageQueue对应的ConsumeQueue文件中。实际上在ConsumeQueue文件中存储的是消息在CommitLog日志文件中的偏移量offset。
4.消息写入的性能保证
broker的写入消息是通过操作系统的PageCache和顺序写这两种机制来进行保证写入性能的。
首先broker会以顺序写的机制将消息写入到commitLog日志文件中,也就是每次写的时候在文件的末尾进行添加一行数据就可以了,这种顺序写的机制要比文件随机写的机制要高很多。
其次在进行写入CommitLog日志文件的时候,不是直接写入到磁盘文件中,而是先进入到OS的PageCache内存缓存中,然后由后台的线程异步将OS PageCahe中的文件进行刷入到磁盘中。
总结来言,就是通过磁盘文件的顺序写+OS PageCache+OS 异步刷盘 这三种方式来进行提高消息的写入速率。
异步刷盘的机制有可能会导致数据的丢失,如果要保证数据的不丢失可以将异步刷盘改为同步刷盘机制,这样的话写入的性能就会降低很多。
标签:文件,MessageQueue,写入,broker,topic,简述,原理,日志,RocketMQ From: https://blog.csdn.net/u013127325/article/details/144924919