面试题答案
一键面试RocketMQ保证消息顺序性和可靠性的方式
-
消息顺序性
- 生产者端:RocketMQ 生产者发送消息时,可以通过选择特定的队列来保证消息顺序。例如,对于一组相关的消息,都发送到同一个队列中。生产者通过
MessageQueueSelector
接口,实现按照业务规则(如订单ID)选择队列,这样相同业务标识的消息就会进入同一个队列。 - 队列内部:RocketMQ 的每个队列本身是严格顺序存储的。消息进入队列后,按照 FIFO(先进先出)的原则进行处理。消费者从队列中拉取消息时,也是顺序拉取,从而保证了消息在单个队列内的顺序性。
- 生产者端:RocketMQ 生产者发送消息时,可以通过选择特定的队列来保证消息顺序。例如,对于一组相关的消息,都发送到同一个队列中。生产者通过
-
消息可靠性
- 刷盘机制:RocketMQ 支持同步刷盘和异步刷盘两种方式。同步刷盘时,消息写入到 PageCache 后,会立即调用
fsync
方法将数据刷入磁盘,确保消息不会因为系统宕机等原因丢失。异步刷盘则是先将消息写入 PageCache,再由后台线程定期将 PageCache 中的数据刷入磁盘,虽然性能较高,但在系统宕机时可能会丢失少量未刷盘的消息。 - 主从复制:RocketMQ 采用主从架构,主节点负责接收和处理消息,从节点通过同步主节点的数据来实现数据备份。当主节点出现故障时,从节点可以切换为主节点继续提供服务,保证消息的可用性和可靠性。主从之间的数据同步方式分为同步复制和异步复制,同步复制确保主从数据完全一致,但会影响性能;异步复制性能较高,但在主节点故障时可能会丢失少量未同步的消息。
- 刷盘机制:RocketMQ 支持同步刷盘和异步刷盘两种方式。同步刷盘时,消息写入到 PageCache 后,会立即调用
高并发场景下消息丢失或乱序的存储机制原因及解决方法
-
消息丢失
- 原因
- 异步刷盘导致数据丢失:在高并发场景下,异步刷盘时如果系统突然宕机,PageCache 中尚未刷入磁盘的消息会丢失。
- 主从异步复制丢失数据:主从异步复制时,主节点故障前,未同步到从节点的消息会丢失。
- 解决方法
- 采用同步刷盘:将刷盘策略设置为同步刷盘,确保消息在写入成功返回前已经持久化到磁盘。
- 配置同步复制:将主从复制模式设置为同步复制,保证主从数据的一致性,避免主节点故障时消息丢失。
- 原因
-
消息乱序
- 原因
- 多线程消费导致乱序:消费者采用多线程消费消息时,如果没有正确处理,可能会出现乱序消费的情况。因为多个线程可能同时从同一个队列拉取消息并处理,导致处理顺序和消息进入队列的顺序不一致。
- 队列负载均衡导致乱序:在高并发场景下,当进行队列负载均衡时,消费者可能会重新分配队列。如果在重新分配过程中,没有妥善处理已拉取但未处理完的消息,可能会导致消息乱序。
- 解决方法
- 单线程消费:消费者端采用单线程消费模式,确保消息按照队列顺序依次处理。
- 处理队列重平衡:在队列负载均衡时,消费者需要暂停拉取新消息,处理完已拉取的消息后,再重新分配队列并继续消费,从而保证消息顺序。
- 原因