面试题答案
一键面试消息发送阶段
- 发送半消息:生产者调用
sendMessageInTransaction
方法向 RocketMQ 发送半消息(Half Message)。半消息对消费者不可见。 - MQ 响应:RocketMQ 接收到半消息后,会检查消息合法性等,若成功则返回响应给生产者,表明半消息发送成功。
本地事务执行阶段
- 执行本地事务:生产者在收到半消息发送成功的响应后,执行本地事务逻辑(如数据库操作等业务逻辑)。
- 返回事务状态:本地事务执行完成后,根据执行结果向 RocketMQ 返回三种事务状态之一:
LocalTransactionState.COMMIT_MESSAGE
:表示本地事务执行成功,RocketMQ 会将半消息标记为可投递状态,供消费者消费。LocalTransactionState.ROLLBACK_MESSAGE
:表示本地事务执行失败,RocketMQ 会删除半消息,消费者不会消费到该消息。LocalTransactionState.UNKNOW
:表示本地事务状态不确定,RocketMQ 会进入事务状态回查阶段。
事务状态回查阶段
- MQ 发起回查:当 RocketMQ 长时间未收到确定的事务状态(如返回
LocalTransactionState.UNKNOW
)时,会主动向生产者发起事务状态回查请求。 - 生产者处理回查:生产者收到回查请求后,会根据本地事务执行记录,再次确定本地事务执行状态,并再次向 RocketMQ 返回上述三种事务状态之一。
- MQ 处理回查结果:RocketMQ 根据生产者返回的回查结果,执行相应操作,如标记消息可投递或删除消息等。