5大分布式事务解决方案详解

分布式事务是大型架构的基石,下面我重点详解分布式事务@mikechen

分布式事务

分布式事务指的是在分布式系统中,多个独立的数据库、或服务共同完成一个业务操作时。

需要保证所有操作要么全部成功,要么全部失败,简单来说,就是确保数据在多个节点之间的一致性。

5大分布式事务解决方案详解-mikechen

例如,一个电商平台的订单创建流程,可能涉及以下服务:

  • 订单服务:创建订单记录;
  • 库存服务:扣减商品库存;
  • 支付服务:处理支付。

如果这三个服务在一个业务流程中,当订单创建成功,但扣减库存失败了,那么就会出现用户下单成功,但实际上商品没有库存的问题。

为了避免这种情况,就需要使用分布式事务来保证。

 

分布式事务解决方案

为了应对上述挑战,业界提出了多种分布式事务解决方案,各有优缺点,适用于不同的场景:

两阶段提交 (2PC)

两阶段提交 (2PC):通过一个协调者(Coordinator),来协调所有参与者(Participants)的操作。

整个过程分为两个阶段,如下图所示:

5大分布式事务解决方案详解-mikechen

 

准备阶段(Prepare):协调者首先询问所有参与者是否准备好提交,所有参与者都同意后,协调者再通知所有参与者进行提交。

提交阶段(Commit):协调者根据所有参与者的反馈决定下一步。

 

优点: 尽量保证了强一致性。

缺点: 存在同步阻塞、单点故障(协调者)和数据不一致的风险。

比如:在第二阶段,如果协调者宕机、或网络分区,可能导致部分参与者提交,部分参与者未提交。

 

三阶段提交 (3PC)

3PC是对2PC的改进,引入了CanCommit阶段,并加入了超时机制,减少了阻塞时间。

5大分布式事务解决方案详解-mikechen

 

CanCommit 阶段:协调者询问所有参与者是否可以执行事务,参与者只返回是否可以执行,不执行任何操作。

PreCommit 阶段:协调者收到所有参与者的肯定回复后,向它们发送预提交请求。

DoCommit 阶段:协调者发送正式提交或回滚请求。

 

优点: 解决了2PC的同步阻塞问题,降低了单点故障的风险。

缺点: 仍无法完全避免数据不一致,并且协议更复杂。

 

TCC (Try-Confirm-Cancel)

TCC是一种业务层面的分布式事务解决方案,它将一个完整的业务逻辑拆分为三个操作:

5大分布式事务解决方案详解-mikechen

Try: 尝试执行,完成所有业务检查,并预留必要的业务资源。

Confirm: 确认执行,真正执行业务操作,不进行任何业务检查,只使用Try阶段预留的资源。

Cancel: 取消执行,释放Try阶段预留的业务资源。

优点: 实现了业务层面的数据最终一致性,性能较好,适用于长事务。

缺点: 侵入性较强,需要业务系统自己实现Try、Confirm、Cancel三个接口,开发成本较高。

 

消息队列最终一致性方案

通过消息队列来异步通知其他服务进行业务操作,从而达到最终一致性。

5大分布式事务解决方案详解-mikechen

发送方完成自己的业务操作并发送消息,如果消息发送失败则回滚,接收方消费消息并执行自己的业务操作,如果执行失败则进行重试。

优点: 实现了服务的解耦,吞吐量高,性能好。

缺点: 只能保证最终一致性,不适用于对实时性要求极高的场景。需要考虑消息的可靠投递、幂等性消费等问题。

评论交流
    说说你的看法