RocketMQ中关于事务消息的实现
2025年3月18日...大约 2 分钟Rocketmq框架
场景描述:
用户在电商平台下单购买商品,订单系统需要记录订单信息,同时积分系统需要为用户增加相应的积分。为确保这两个操作的一致性,我们引入 RocketMQ 的事务消息机制。
实现步骤:
发送半事务消息:
订单系统在接收到用户下单请求后,首先向 RocketMQ 发送一条半事务消息,表示即将执行订单创建和积分增加的操作。此时,这条消息对消费者(积分系统)不可见。
执行本地事务:
在发送半事务消息后,订单系统开始执行本地事务,包括:
- 在订单数据库中创建新的订单记录。
- 在事务日志表中记录此次操作,用于后续的事务回查。
提交事务状态:
本地事务执行完毕后,订单系统根据执行结果向 RocketMQ 提交二次确认:
- 如果本地事务执行成功,则提交
Commit
,RocketMQ 会将之前的半事务消息标记为可投递,积分系统即可消费该消息,增加用户积分。 - 如果本地事务执行失败,则提交
Rollback
,RocketMQ 会删除该半事务消息,确保积分系统不会消费到此消息。
- 如果本地事务执行成功,则提交
事务回查:
在某些情况下,例如网络异常或订单系统崩溃,RocketMQ 未收到二次确认。此时,RocketMQ 会定期对未确认的半事务消息进行回查,通过调用订单系统预先实现的
checkLocalTransaction
方法,查询本地事务的实际执行结果,并根据查询结果决定是提交还是回滚消息。
关键点:
- 半事务消息: 指暂时对消费者不可见的消息,只有在收到生产者的
Commit
确认后,才会对消费者可见。 - 事务日志表: 用于记录本地事务的执行情况,便于在事务回查时确定事务的最终状态。
- 事务回查: RocketMQ 的补偿机制,确保在异常情况下也能保证消息和本地事务的一致性。