MST

星途 面试题库

面试题:消息队列之RocketMQ消息存储可靠性的极致探究

在高并发、大数据量场景下,RocketMQ为确保消息存储可靠性,在存储层的设计上做了哪些优化?如何平衡可靠性与性能之间的关系?如果出现网络抖动,RocketMQ怎样保证已发送消息的可靠存储?
22.1万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

1. RocketMQ存储层确保消息存储可靠性的优化设计

  • 刷盘机制
    • 同步刷盘:生产者发送消息到Broker后,Broker在将消息写入PageCache的同时,会同步将消息刷入磁盘,只有刷盘成功才会给生产者返回成功响应。这种方式确保了消息不会因为系统故障或掉电而丢失,极大地提高了消息存储的可靠性。例如,在金融交易等对数据可靠性要求极高的场景中,同步刷盘能保证每一笔交易消息都被持久化到磁盘。
    • 异步刷盘:消息先写入PageCache,然后由专门的线程异步将PageCache中的数据刷入磁盘。虽然这种方式存在系统故障时部分未刷盘消息丢失的风险,但它大大提高了消息写入的性能。在一些对性能要求较高,对数据丢失可容忍度相对较高的场景,如普通的日志记录场景,可以采用异步刷盘。
  • 主从架构与数据复制
    • RocketMQ采用Master - Slave架构,Master负责处理读写请求,Slave从Master同步数据。当Master出现故障时,Slave可以切换为Master继续提供服务,保证了系统的可用性和消息存储的可靠性。数据复制方式有同步复制和异步复制。
    • 同步复制:Master等待所有Slave同步完数据后才向生产者返回成功响应,确保了Master和Slave数据的强一致性,进一步提高可靠性。但由于需要等待Slave同步,会对性能有一定影响。
    • 异步复制:Master在将消息写入自身存储后就向生产者返回成功响应,同时异步将消息复制到Slave。这种方式性能较高,但可能存在Master故障时部分未同步到Slave的消息丢失的情况。

2. 平衡可靠性与性能的关系

  • 根据业务场景选择刷盘和复制策略:对于可靠性要求极高的业务,如资金交易、重要订单处理等,选择同步刷盘和同步复制策略,虽然会牺牲一定性能,但能确保消息万无一失。而对于像实时监控数据上报、一般的用户行为日志记录等对可靠性要求相对较低,对性能要求较高的业务场景,选择异步刷盘和异步复制策略,在可接受的少量数据丢失风险下,换取更高的系统性能。
  • 优化存储结构:RocketMQ采用基于CommitLog的存储结构,所有消息都顺序写入CommitLog,然后通过ConsumeQueue记录消息在CommitLog中的偏移量等信息,这种结构减少了磁盘I/O寻道时间,提高了写入性能。同时,通过合理的PageCache使用,将热点数据缓存到内存,减少磁盘I/O次数,进一步提升性能,而刷盘机制又保证了数据的可靠性。

3. 网络抖动时保证已发送消息可靠存储的方法

  • 生产者重试机制:当生产者发送消息后未收到Broker的成功响应(可能因为网络抖动导致响应丢失),生产者会根据配置的重试策略进行重试。例如,默认情况下,RocketMQ生产者会重试2次。如果第一次发送因为网络抖动没有收到确认,会再次尝试发送,提高消息成功存储到Broker的概率。
  • Broker端的高可用机制:在网络抖动时,Master和Slave之间的数据同步可能会受到影响。但由于RocketMQ的主从架构,即使Master暂时无法与部分Slave同步数据,只要Master自身存储正常,消息就不会丢失。当网络恢复后,Master会继续将未同步的消息复制到Slave,确保数据的一致性和可靠性。同时,在网络抖动期间,如果Master出现故障,Slave能及时切换为Master继续提供服务,保证消息存储的连续性。