MST

星途 面试题库

面试题:消息队列RocketMQ事务消息原理方面的问题

请阐述RocketMQ事务消息的两阶段提交过程,以及在这个过程中如何保证消息的最终一致性?
20.9万 热度难度
后端开发消息队列

知识考点

AI 面试

面试题答案

一键面试

RocketMQ事务消息两阶段提交过程

  1. 第一阶段 - 发送Half消息
    • 生产者向RocketMQ发送Half消息(也叫Prepare消息),此消息对消费者不可见。
    • RocketMQ接收到Half消息后,将其持久化并返回成功响应给生产者。
  2. 第二阶段 - 执行本地事务并提交或回滚消息
    • 生产者在收到Half消息发送成功响应后,执行本地事务。
    • 根据本地事务执行结果,生产者向RocketMQ发送Commit或Rollback消息。
    • 如果本地事务执行成功,生产者发送Commit消息,RocketMQ将Half消息标记为可投递状态,消费者可以消费该消息。
    • 如果本地事务执行失败,生产者发送Rollback消息,RocketMQ将删除之前存储的Half消息,消费者不会消费到该消息。

保证消息最终一致性的方法

  1. 事务状态回查机制
    • 若RocketMQ长时间未收到生产者的Commit或Rollback消息(例如网络异常导致生产者的Commit/Rollback消息未成功发送到RocketMQ),RocketMQ会主动向生产者回查本地事务状态。
    • 生产者根据本地事务记录,向RocketMQ返回对应的事务状态(Commit或Rollback),从而保证消息状态的最终确定,确保消息要么可消费(Commit),要么被删除(Rollback),实现最终一致性。
  2. 本地事务的幂等性
    • 生产者在实现本地事务时,需要保证本地事务的幂等性。因为RocketMQ在事务状态回查时,可能多次调用生产者的事务状态查询接口。
    • 幂等性的本地事务确保无论被调用多少次,其执行结果都相同,不会因重复调用而产生额外的副作用,进一步保障了消息和本地事务状态的一致性。