1. 错误思路
- 问题描述: 发送MQ超时导致事务回滚,但下游可能错误地感知到订单更新成功,而数据库状态未更新,造成数据不一致。
2. 基于 RocketMQ 的分布式事务
- 事务消息: RocketMQ提供的高级消息类型,支持分布式场景下消息生产与本地事务的一致性。
- 交互流程:
- 生产者发送消息至RocketMQ服务端。
- 服务端持久化消息后返回Ack,消息标记为"暂不能投递"(半事务消息)。
- 生产者执行本地事务逻辑。
- 根据本地事务结果,生产者提交二次确认(Commit或Rollback)。
- 服务端根据确认结果处理消息。
- 特殊情况处理:
- 网络问题或生产者重启,服务端发起消息回查。
- 生产者检查本地事务状态,再次提交确认。
- 交互流程:
3. 基于本地事务的一致性处理
- Spring框架: 实现MQ最终一致性的过程。
- 业务数据更新: 在事务保护下更新数据库。
- 创建本地消息记录: 创建包含将来发送至MQ的消息的记录。
- 业务事务提交: 确保数据更新和消息记录的原子性和一致性。
- 异步发送消息: 消息服务轮询未发送消息,发送至MQ并更