MST

星途 面试题库

面试题:消息队列如何在常规场景下保证数据一致性

在常见的后端开发场景中,如订单处理系统使用消息队列传递订单信息,简述消息队列是通过哪些机制来保证数据一致性的,包括消息的发送、存储与消费等环节。
34.7万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

消息发送环节

  1. 事务消息机制
    • 以订单处理系统为例,发送方先发送一条半事务消息(如向消息队列发送订单创建消息前先发半事务消息)。消息队列收到半事务消息后暂存且不投递。
    • 发送方执行本地事务(比如在订单数据库中插入订单记录)。
    • 发送方根据本地事务执行结果,向消息队列提交(本地事务成功)或回滚(本地事务失败)半事务消息。若提交,消息队列开始正常投递;若回滚,消息队列丢弃该半事务消息。这样确保了只有本地订单数据成功插入时,订单消息才会被发送出去,保证了订单数据和消息的一致性。
  2. 确认机制(ACK)
    • 发送方发送订单消息后,等待消息队列的确认(ACK)。
    • 消息队列接收到消息并成功存储后,向发送方返回ACK。若发送方在一定时间内未收到ACK,会重新发送消息,防止消息丢失,从而保证消息发送的可靠性和一致性。

消息存储环节

  1. 持久化机制
    • 消息队列将订单消息持久化到磁盘等存储介质。例如使用日志结构合并树(LSM - Tree)或其他文件存储格式。
    • 这样即使消息队列服务重启,已存储的订单消息不会丢失,保证了消息在存储过程中的一致性和可靠性。
  2. 副本机制
    • 消息队列通常采用多副本策略,将订单消息复制到多个节点存储。
    • 比如主从架构中,主节点存储消息后同步到从节点。当主节点故障时,从节点可以接替成为主节点,继续提供服务,确保消息不会因单点故障而丢失,维持消息存储的一致性。

消息消费环节

  1. 幂等性处理
    • 消费端设计成幂等的。在订单处理系统中,消费端接收到订单消息进行处理(如更新订单状态等操作)。若由于网络等原因,消费端重复接收到相同的订单消息,其执行结果和第一次处理时相同。例如通过数据库的唯一约束(如订单号唯一),当重复处理相同订单消息时,数据库操作不会产生重复数据,保证了订单数据处理的一致性。
  2. 消费确认机制(ACK)
    • 消费端成功处理订单消息后,向消息队列发送消费确认(ACK)。
    • 消息队列只有收到消费确认后,才会将该订单消息标记为已消费并从队列中删除(或移到已消费队列等处理方式)。若消息队列未收到ACK,会重新投递该消息给其他消费者或重试投递,确保订单消息能被成功处理,保证了消息消费的一致性。