一、TCC模式
TCC(Try-Confirm-Cancel)分布式事务模型最早由微软架构师Pat Helland提出,针对分布式系统环境下的数据一致性问题,采用服务化的两阶段编程模型。
1. Try阶段(资源预留)
- 作为一阶段操作,负责完成所有业务检查
- 预留必要的业务资源
- 采用”柔性检查”机制,不直接操作实际业务数据
2. Confirm阶段(业务提交)
- 作为二阶段提交操作,执行真正的业务逻辑
- 必须保证幂等性设计
- 实际扣减Try阶段预留的资源
3. Cancel阶段(资源释放)
- 回滚Try阶段预留的资源
- 同样需要保证幂等性
- 通常在业务异常或超时情况下触发
相比传统XA协议的优势
- 单点故障问题:将事务控制权交给业务发起方
- 同步阻塞问题:引入超时机制,细粒度资源控制
- 数据一致性问题:提供完善的补偿机制
二、队列模式
基本概念
队列模式是一种实现最终一致性的分布式事务解决方案,其核心思想是将分布式事务拆分为多个本地事务进行处理。
实现原理
- 事务拆分:将复杂的分布式事务拆分为多个独立的本地事务
- 消息日志:通过消息日志记录事务状态和操作指令
- 异步执行:利用消息队列实现各服务间的异步通信
技术实现
- 消息中间件选择:Kafka、RocketMQ、RabbitMQ
- 消息存储方案:本地文件系统、数据库存储、专用消息中间件
异常处理机制
- 自动重试:配置消息消费的最大重试次数
- 人工干预:提供管理界面查看失败消息
- 死信队列:超过最大重试次数的消息转入死信队列
优缺点
- 优点:系统解耦、提高系统吞吐量、降低资源锁定时间
- 缺点:实现复杂度较高、存在短暂的数据不一致窗口期
三、Saga模式
Saga模式最早起源于1987年Hector Garcia-Molina和Kenneth Salem发表的数据库论文,将长事务分解为一系列短事务。
基本原理
一个Saga事务是由多个本地事务组成的全局事务,每个本地事务都有预定义的补偿事务。
Saga事务的执行流程
- 正向执行:按照预定顺序依次执行各个子事务
- 反向补偿:当某个子事务执行失败时,按照相反顺序执行补偿操作
基本协议
- 向前恢复(forward recovery):执行过程中遇到失败时进行重试
- 向后恢复(backward recovery):发生错误后撤销之前所有成功的子事务
与传统2PC相比的优势
- 避免了长时间的资源锁定
- 更适合松耦合的微服务架构
- 具有更好的可扩展性
- 对业务侵入性较小
局限性
- 补偿事务不一定能完全恢复原始状态
- 需要业务层面设计完备的补偿逻辑
- 可能存在”脏读”问题