Skip to content

在分布式系统中,事务管理一直是一个复杂而又关键的问题。传统的关系型数据库虽然提供了 ACID(原子性、一致性、隔离性和持久性)事务的支持,但是在分布式场景下,由于网络延迟、节点故障等因素的影响,保证分布式事务的 ACID 特性变得更加困难。

2PC

两阶段提交(Two-Phase Commit,2PC)是一种经典的分布式事务处理协议,旨在确保分布式环境下的多个参与者对某一事务的操作能够以原子方式进行提交或回滚,从而保证事务的一致性。

在互联网业务场景中,由于2PC协议存在单点故障、性能开销、阻塞问题和复杂性等局限性,通常会选择更轻量级和灵活的事务处理方案。

TCC

TCC(Try-Confirm-Cancel)是一种基于补偿机制的分布式事务处理模式,旨在解决分布式系统中的事务一致性问题。它将整个事务拆分为三个阶段:尝试(Try)、确认(Confirm)和取消(Cancel),通过执行相应的补偿操作来保证事务的一致性。

TCC 将事务的提交回滚提升到业务层,可以看作是业务层上的 2PC 版本。TCC 在实践中应用较少,主要因为其需要显式编写补偿逻辑复杂性,以及对业务逻辑的高要求等因素。

本地消息表

本地消息表最初由 eBay 提出,它将分布式事务拆分成一系列本地事务,再配合定时任务补偿及 MQ 组件保障数据的最终一致性。具体来说,该模式可分为以下几个步骤;

  1. 拆分事务:将分布式事务分解为一系列本地事务,每个本地事务在单个节点上执行,以便更好地管理和维护。
  2. 本地事务执行:在执行本地事务操作时,将操作记录到本地消息表中,以确保本地事务的一致性。
  3. 消息发布:使用定时任务定期检查本地消息表,并将其中的消息发布到消息队列中。这确保了消息一定会被发送出去,即使在异常情况下也能够被处理。
  4. 消息确认:一旦消息被成功发送到消息队列中,将本地消息表中对应的消息记录标记为已发送。这有助于跟踪消息的发送状态和保证数据的最终一致性。

可以采用两个轮询器一快一慢的方式,一个用于满足消息的实时性需求,另一个用于处理异常情况。这是一种常见的优化方式,能够提高系统的稳定性和可靠性。

事务消息

事务消息是 RocketMQ 的高级特性消息,它也是实现分布式事务的一种常用方案。相比较“本地消息表”的方式,“事务消息”将(半)消息放在 RocketMQ 中。由于消息在不在数据库无法与业务数据保证事务性,所以需要提供一个数据回查接口,来抉择半消息执行COMMIT OR ROLLBACK,从而保证 RocketMQ 与业务数据库的最终一致性。

基于 MIT 许可发布