一, 消息事务
其实很多场景下, 我们 "发消息" 这个过程, 目的往往是通知另外一个系统或者模块去更新数据, 消息队列中的 "事务", 主要解决消息生产者和消息消费者的数据一致性问题.
用户在电商 App 上购物时, 先把商品加到购物车里, 然后几件商品一起下单, 最后支付, 完成购物流程.
这个过程中有一个需要用到消息队列的步骤, 订单系统创建订单后, 发消息给购物车系统, 将已下单的商品从购物车中删除. 因为从购物车删除已下单商品这个步骤, 并不是用户下单支付这个主要流程中必要的步骤, 使用消息队列来异步清理购物车是更加合理.
对于订单系统, 它创建订单的过程实际执行了 2 个步骤的操作:
在订单库中插入一条订单数据, 创建订单;
发消息给消息队列, 消息的内容就是刚刚创建的订单
对于购物车系统:
订阅相应的主题, 接收订单创建的消息, 然后清理购物车, 在购物车中删除订单的商品.
在分布式系统中, 上面提到的步骤, 任何一个都有可能失败, 如果不做任何处理, 那就有可能出现订单数据与购物车数据不一致的情况, 比如:
创建了订单, 没有清理购物车;
订单没创建成功, 购物车里面的商品却被清掉了.
所以我们需要解决的问题为: 在上述任意步骤都有可能失败的情况下, 还要保证订单库和购物车库这两个库的数据一致性.
二, 分布式事务
分布式事务就是要在分布式系统中实现事务. 在分布式系统中, 在保证可用性和不严重牺牲性能的前提下, 光是要实现数据的一致性就已经非常困难了, 显然实现严格的分布式事务是更加不可能完成的任务. 所以目前大家所说的分布式事务, 更多情况下, 是在分布式系统中事务的不完整实现, 在不同的应用场景中, 有不同的实现, 目的都是通过一些妥协来解决实际问题.
来源: http://www.bubuko.com/infodetail-3170816.html