RocketMQ 事务消息原理
依赖于 TransactionListener 接口实现
-
executeLocalTransaction() 在发送消息后调用,用于执行本地事务,如果本地事务执行成功,RocketMQ 再提交消息
-
checkLocalTransaction() 用于检查事务是否执行成功,RocketMQ 依赖此方法做补偿
通过内部的两个 Topic 来实现对消息的两阶段支持
prepare:将消息(消息带有事务标识)投递到一个名为 RMS_SYS_TRANS_HALF_TOPIC 的 topic 中,而不是投递到真正的 topic 中
commit/rollback:producer 再通过 TransactionListener 的 executeLocalTransaction() 执行本地事务,当producer 的 事务处理成功或者失败后,producer 会向broker 发送 commit 或者 rollback 命令,如果是 commit 会将消息投递到真实的 topic 中,然后再投递一个表示删除的消息到 RMS_SYS_TRANS_HALF_TOPIC 中,表示当前事务完成;如果是 rollback,则只需投递表示删除的消息即可
- Prepare失败:给应用返回发送消息失败
- 事务失败:发送回滚命令给 broker,由 broker 执行消息回滚
- commit 或 rollback 失败:由 broker 定时向 producer 发起事务检查,如果本地事务成功,则提交消息事务,否则回滚事务
事务检查有两种情况 - commit/rollback:broker 会执行相应的操作
- 如果是 TRANSACTION_NOT_TYPE,则一段时间后再次及检查,当检查的次数超过上限(默认15次),则丢弃消息