面试题答案
一键面试1. 刷盘方式
- 同步刷盘
- 特点:消息写入到PageCache后,会立即调用fsync等系统调用将PageCache中的数据强制刷入磁盘,确保消息在磁盘上持久化完成才返回成功响应给生产者。这种方式数据可靠性极高,即使系统崩溃,由于消息已经在磁盘上,不会丢失。但因为涉及磁盘I/O操作,性能相对较低,刷盘操作是阻塞式的,会影响生产者发送消息的响应时间。
- 适用场景:适用于对数据可靠性要求极高,不容许消息丢失的场景,如金融交易系统中的资金变动消息等。
- 异步刷盘
- 特点:消息写入PageCache后,立即返回成功响应给生产者,无需等待数据真正刷入磁盘。之后由专门的刷盘线程按照一定的策略(如定时、达到一定消息量等)将PageCache中的数据刷入磁盘。这种方式性能较高,因为生产者发送消息的过程不会被刷盘的磁盘I/O阻塞。但数据可靠性相对同步刷盘较低,如果系统在刷盘线程将数据刷入磁盘前崩溃,PageCache中的数据可能丢失。
- 适用场景:适用于对性能要求较高,对消息丢失有一定容忍度的场景,如一般的业务通知消息场景等。
2. 存储结构
- CommitLog
- 特点:RocketMQ采用的是混合型的存储结构,所有主题的消息都顺序存储在CommitLog文件中。这种结构有利于提高磁盘I/O性能,因为顺序写盘比随机写盘效率高很多。CommitLog文件以固定大小(默认1G)进行切分,当一个文件写满后,会生成新的CommitLog文件。但查找特定主题消息时相对复杂,需要通过ConsumeQueue进行索引查找。
- 适用场景:适用于需要高效写入消息的场景,通过顺序写盘提升整体消息写入性能,满足高并发消息写入的需求。
- ConsumeQueue
- 特点:它是消息消费的逻辑队列,为每个主题和队列都维护一个ConsumeQueue。ConsumeQueue中存储的是指向CommitLog中消息的物理偏移量等索引信息。通过这种索引结构,消费者可以快速定位到要消费的消息在CommitLog中的位置,加快消息消费的速度。它是一种轻量级的存储结构,减少了存储开销。
- 适用场景:适用于快速定位消息进行消费的场景,帮助消费者高效地从CommitLog中拉取消息进行消费,提升消息消费的效率。