三. 利用事务消息实现分布式事务
消息队列中的事务解决的是消息生产者和消费者的数据一致性问题。
在订单系统中,创建订单的过程执行了两个操作:
- 在订单库中插入一条订单数据,创建订单
- 将订单内容发给消息队列,购物车订阅了相应主题,根据订单内容中的商品来清理购物车。
这两个步骤要么同时成功,要么同时失败,否则就会出现订单数据与购物车数据不一致的情况。可以通过分布式事务来解决:
- 首先订单系统在消息队列上开启一个事务
- 然后订单系统给消息队列发送一个半消息,半消息与普通消息的唯一区别是:在事务提交前,半消息对于消费者来说是不可见的。
- 半消息发送成功后,订单系统就执行本地事务,创建订单。
- 如果订单创建成功,就提交事务消息,否则就进行回滚。事务提交后,消费者,也就是购物车系统,就可以成功消费那个半消息了。