面试题答案
一键面试存储结构
- CommitLog:RocketMQ采用混合型的存储结构,所有主题的消息都顺序存储在CommitLog中。这使得写入时能充分利用磁盘的顺序写特性,提升写入性能。
- ConsumeQueue:它是消息消费的逻辑队列,每个主题下每个队列都有一个对应的ConsumeQueue。ConsumeQueue存储了消息在CommitLog中的物理偏移量、消息大小和Tag的哈希值等信息,方便快速定位消息。
- IndexFile:用于消息的索引,根据消息的Key建立索引,方便通过Key快速查找消息。IndexFile中记录了Key对应的消息在CommitLog中的物理位置等信息。
刷盘策略
- 同步刷盘:消息写入到CommitLog后,会等待操作系统将数据真正写入磁盘,才返回成功响应。这种策略能保证消息不丢失,但会降低系统的写入性能。
- 异步刷盘:消息写入CommitLog后,立即返回成功响应,然后由后台线程异步将数据刷入磁盘。这种方式写入性能高,但在系统崩溃等极端情况下,可能会丢失少量未刷盘的消息。
保证消息可靠性
- 刷盘机制:通过同步刷盘策略,确保消息真正持久化到磁盘,避免因系统故障导致消息丢失。
- 主从复制:RocketMQ支持主从架构,主节点将消息同步到从节点,当主节点出现故障时,从节点可以接替工作,保证消息不丢失。
- 重试机制:生产者在发送消息失败时,会自动重试一定次数,确保消息尽可能发送成功。消费者在消费消息失败时,也可以根据配置进行重试,避免因消费失败导致消息丢失。
保证消息顺序性
- 生产者端:生产者通过指定消息队列,将顺序相关的消息发送到同一个队列中,保证消息进入队列的顺序。
- 队列存储:消息在ConsumeQueue中按照顺序存储,保证消息在存储层面的顺序性。
- 消费者端:消费者采用单线程消费一个队列中的消息,确保按照消息进入队列的顺序进行消费,从而保证消息的顺序性。